3 from don import constants, _shared
5 def _integer_size_to_string_serializer(integer_size):
6 minimum = -(2 ** (integer_size - 1))
7 maximum = 2 ** (integer_size - 1) - 1
9 def serializer(integer):
10 assert minimum <= integer and integer <= maximum
11 return '{}i{}'.format(integer, integer_size)
15 def _serialize_float(f):
16 return '{}f'.format(f)
18 def _serialize_double(d):
19 return '{}d'.format(d)
21 def _serialize_binary(b):
22 return '"{}"b'.format(binascii.hexlify(b).decode('ascii'))
24 def _utf_encoding_to_serializer(utf_encoding):
26 return '"{}"{}'.format(s, utf_encoding)
30 def _string_serialize_list(l):
31 return '[{}]'.format(', '.join(map(serialize, l)))
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())) + ' }'
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,
59 return _STRING_SERIALIZERS[o.tag](o.value)