Skip to content

Instantly share code, notes, and snippets.

@RonnyPfannschmidt
Created April 3, 2011 10:36
Show Gist options
  • Save RonnyPfannschmidt/900346 to your computer and use it in GitHub Desktop.
Save RonnyPfannschmidt/900346 to your computer and use it in GitHub Desktop.
def parse_payload(data):
assert data, "Invalid data to parse, it's empty."
length, extra = data.split(':', 1)
length = int(length)
payload, extra = extra[:length], extra[length:]
assert extra, "No payload type: %r, %r" % (payload, extra)
payload_type, remain = extra[0], extra[1:]
assert len(payload) == length, "Data is wrong length %d vs %d" % (length, len(payload))
return payload, payload_type, remain
def parse_list(data):
if len(data) == 0: return []
result = []
value, extra = parse_tnetstring(data)
result.append(value)
while extra:
value, extra = parse_tnetstring(extra)
result.append(value)
return result
def parse_pair(data):
key, extra = parse_tnetstring(data)
assert extra, "Unbalanced dictionary store."
value, extra = parse_tnetstring(extra)
assert value, "Got an invalid value, null not allowed."
return key, value, extra
def parse_dict(data):
if len(data) == 0: return {}
key, value, extra = parse_pair(data)
result = {key: value}
while extra:
key, value, extra = parse_pair(extra)
result[key] = value
return result
def parse_tnetstring(data):
payload, payload_type, remain = parse_payload(data)
if payload_type == '#':
value = int(payload)
elif payload_type == '"':
value = payload
elif payload_type == '}':
value = parse_dict(payload)
elif payload_type == ']':
value = parse_list(payload)
else:
assert False, "Invalid payload type: %r" % payload_type
return value, remain
TESTS = {
'0:}': {},
'0:]': [],
'34:5:hello"22:11:12345678901#4:this"]}': {'hello': [12345678901, 'this']},
'5:12345#': 12345,
'12:this is cool"': "this is cool",
'0:"': "",
'24:5:12345#5:67890#5:xxxxx"]': [12345, 67890, 'xxxxx'],
}
for data, expect in TESTS.items():
payload, remain = parse_tnetstring(data)
assert not remain, "Had trailing junk: %r" % remain
assert payload != None, "Didn't get a payload."
print "EXPECT", repr(expect), "GOT", repr(payload)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment