Add capnp-json serializer script. Also fix bugs in from_dict

This commit is contained in:
Jason Paryani
2013-10-22 13:22:08 -07:00
parent 105450906b
commit 0498d04632
2 changed files with 53 additions and 1 deletions

View File

@@ -568,7 +568,15 @@ import collections as _collections
cdef _from_dict_helper(msg, field, d): cdef _from_dict_helper(msg, field, d):
d_type = type(d) d_type = type(d)
if d_type is dict: if d_type is dict:
sub_msg = getattr(msg, field) try:
sub_msg = getattr(msg, field)
except Exception as e:
str_error = str(e)
if 'expected isSetInUnion(field)' in str_error:
msg.init(field)
sub_msg = getattr(msg, field)
else:
raise
for key, val in d.iteritems(): for key, val in d.iteritems():
if key != 'which': if key != 'which':
_from_dict_helper(sub_msg, key, val) _from_dict_helper(sub_msg, key, val)
@@ -584,6 +592,7 @@ cdef _from_dict_helper(msg, field, d):
else: else:
setattr(msg, field, d) setattr(msg, field, d)
cdef _from_dict(msg, d): cdef _from_dict(msg, d):
for key, val in d.iteritems(): for key, val in d.iteritems():
if key != 'which': if key != 'which':

43
scripts/capnp-json.py Normal file
View File

@@ -0,0 +1,43 @@
#!/usr/bin/env python
import argparse
import sys
import json
import capnp
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument("command")
parser.add_argument("schema_file")
parser.add_argument("struct_name")
return parser.parse_args()
def encode(schema_file, struct_name):
schema = capnp.load(schema_file)
struct_schema = getattr(schema, struct_name)
struct_dict = json.load(sys.stdin)
struct = struct_schema.from_dict(struct_dict)
struct.write(sys.stdout)
def decode(schema_file, struct_name):
schema = capnp.load(schema_file)
struct_schema = getattr(schema, struct_name)
struct = struct_schema.read(sys.stdin)
json.dump(struct.to_dict(), sys.stdout)
def main():
args = parse_args()
command = args.command
kwargs = vars(args)
del kwargs['command']
globals()[command](**kwargs) # hacky way to get defined functions, and call function with name=command
main()