Created
April 3, 2011 10:36
-
-
Save RonnyPfannschmidt/900346 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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