Major reorganization
[ton] / don / string.py
1 import binascii
2
3 from don import constants, _shared
4
5 def _integer_size_to_string_serializer(integer_size):
6     minimum = -(2 ** (integer_size - 1))
7     maximum = 2 ** (integer_size - 1) - 1
8     
9     def serializer(integer):
10         assert minimum <= integer and integer <= maximum
11         return '{}i{}'.format(integer, integer_size)
12
13     return serializer
14
15 def _serialize_float(f):
16     return '{}f'.format(f)
17
18 def _serialize_double(d):
19     return '{}d'.format(d)
20
21 def _serialize_binary(b):
22     return '"{}"b'.format(binascii.hexlify(b).decode('ascii'))
23
24 def _utf_encoding_to_serializer(utf_encoding):
25     def serializer(s):
26         return '"{}"{}'.format(s, utf_encoding)
27
28     return serializer
29
30 def _string_serialize_list(l):
31     return '[{}]'.format(', '.join(map(serialize, l)))
32
33 def _string_serialize_dictionary(d):
34     def serialize_kvp(kvp):
35         return serialize(kvp[0]) + ': ' + serialize(kvp[1])
36     return '{ ' + ', '.join(map(serialize_kvp, d.items())) + ' }'
37
38 _STRING_SERIALIZERS = {
39     constants.VOID: lambda o: 'null',
40     constants.TRUE: lambda o: 'true',
41     constants.FALSE: lambda o: 'false',
42     constants.INT8: _integer_size_to_string_serializer(8),
43     constants.INT16: _integer_size_to_string_serializer(16),
44     constants.INT32: _integer_size_to_string_serializer(32),
45     constants.INT64: _integer_size_to_string_serializer(64),
46     constants.FLOAT: _serialize_float,
47     constants.DOUBLE: _serialize_double,
48     constants.BINARY: _serialize_binary,
49     constants.UTF8: _utf_encoding_to_serializer('utf8'),
50     constants.UTF16: _utf_encoding_to_serializer('utf16'),
51     constants.UTF32: _utf_encoding_to_serializer('utf32'),
52     constants.LIST: _string_serialize_list,
53     constants.DICTIONARY: _string_serialize_dictionary,
54 }
55
56 def serialize(o):
57     o = _shared._tag(o)
58     
59     return _STRING_SERIALIZERS[o.tag](o.value)
60
61 def deserialize(s):
62     pass