From 4e43d1b217f5b7dc020bb5ca8afc018e9917c58b Mon Sep 17 00:00:00 2001 From: Max Bernstein Date: Fri, 24 Nov 2023 12:12:08 -0500 Subject: [PATCH] Add list length function --- scrapscript.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scrapscript.py b/scrapscript.py index 8e12a787..4521fd1b 100755 --- a/scrapscript.py +++ b/scrapscript.py @@ -1833,6 +1833,17 @@ def test_stdlib_serialize_expr(self) -> None: Bytes(value=b"d4:leftd4:type3:Int5:valuei1ee2:op3:ADD5:rightd4:type3:Int5:valuei2ee4:type5:Binope"), ) + def test_stdlib_listlength_empty_list_returns_zero(self) -> None: + self.assertEqual(self._run("$$listlength []", STDLIB), Int(0)) + + def test_stdlib_listlength_returns_length(self) -> None: + self.assertEqual(self._run("$$listlength [1,2,3]", STDLIB), Int(3)) + + def test_stdlib_listlength_with_non_list_raises_type_error(self) -> None: + with self.assertRaises(TypeError) as ctx: + self._run("$$listlength 1", STDLIB) + self.assertEqual(ctx.exception.args[0], "listlength Expected List, but got Int") + class BencodeTests(unittest.TestCase): def test_bencode_int(self) -> None: @@ -2006,11 +2017,18 @@ def jsondecode(obj: Object) -> Object: return make_object(data) +def listlength(obj: Object) -> Object: + if not isinstance(obj, List): + raise TypeError(f"listlength Expected List, but got {type(obj).__name__}") + return Int(len(obj.items)) + + STDLIB = { "$$add": NativeFunction(lambda x: NativeFunction(lambda y: Int(unpack_int(x) + unpack_int(y)))), "$$fetch": NativeFunction(fetch), "$$jsondecode": NativeFunction(jsondecode), "$$serialize": NativeFunction(lambda obj: Bytes(serialize(obj))), + "$$listlength": NativeFunction(listlength), }