X-Git-Url: https://code.kerkeslager.com/?p=sandbox;a=blobdiff_plain;f=serial%2Fserial%2Ftext.py;fp=serial%2Fserial%2Ftext.py;h=2d957d6716eee1b99f5b8f7cb775415825ac0cb6;hp=0f19a0ea3a6faaef7ed6418f398948c141fb1ac0;hb=4689baa84252ba845bfba1dd6faea9ab3f103051;hpb=6cb74967b5b52c7b072c0477aa19e52f30b67d7a diff --git a/serial/serial/text.py b/serial/serial/text.py index 0f19a0e..2d957d6 100644 --- a/serial/serial/text.py +++ b/serial/serial/text.py @@ -46,6 +46,14 @@ def _make_string_serializer(prefix): return serializer +def _indent(s, depth = 2): + return '\n'.join(' ' * depth + line for line in s.split('\n')) + +def _serialize_list(to): + assert isinstance(to.instance, list) + + return '[\n' + _indent(',\n'.join(serialize(i) for i in to.instance)) + '\n]' + _SERIALIZERS = { tags.NULL: _make_literal_serializer(None, 'null'), tags.TRUE: _make_literal_serializer(True, 'true'), @@ -62,6 +70,7 @@ _SERIALIZERS = { tags.UTF8: _make_string_serializer('utf8'), tags.UTF16: _make_string_serializer('utf16'), tags.UTF32: _make_string_serializer('utf32'), + tags.LIST: _serialize_list, } def serialize(to): @@ -171,6 +180,39 @@ def _make_string_deserializer(tag, prefix): return deserializer +def _deserialize_list(s): + s = s.lstrip() + + if not s.startswith('['): + return False, None, None + + instance = [] + + s = s[1:].lstrip() + + succeeded, result, s = _deserialize_one(s) + + # TODO Handle empty lists + + if succeeded: + instance.append(result) + + s = s.lstrip() + + while not s.startswith(']'): + assert s.startswith(',') + s = s[1:].lstrip() + + succeeded, result, s = _deserialize_one(s) + + # TODO Handle trailing commas + assert succeeded + instance.append(result) + s = s.lstrip() + + assert s.startswith(']') + return True, tags.TaggedObject(tag = tags.LIST, instance = instance), s[1:] + _DESERIALIZERS = [ _make_literal_deserializer(tags.NULL, None, 'null'), _make_literal_deserializer(tags.TRUE, True, 'true'), @@ -187,14 +229,22 @@ _DESERIALIZERS = [ _make_string_deserializer(tags.UTF8, 'utf8'), _make_string_deserializer(tags.UTF16, 'utf16'), _make_string_deserializer(tags.UTF32, 'utf32'), + _deserialize_list, ] -def deserialize(s): +def _deserialize_one(s): for deserializer in _DESERIALIZERS: succeeded, result, remaining = deserializer(s) if succeeded: - assert remaining == '' - return result + return succeeded, result, remaining + + return False, None, None + +def deserialize(s): + succeeded, result, remaining = _deserialize_one(s) + + assert succeeded + assert remaining == '' - raise Exception() + return result