mirror of
https://github.com/ubf/ubf.git
synced 2026-04-16 17:55:48 +00:00
67 lines
2.4 KiB
Python
67 lines
2.4 KiB
Python
|
|
##
|
|
##
|
|
|
|
from pyubf import Integer, Float, Atom, String, Binary, Tuple, List, PropList
|
|
from py_interface import erl_term
|
|
|
|
## py_interface -> pyebf
|
|
def from_py_interface(value):
|
|
if isinstance(value, int) or isinstance(value, long):
|
|
return Integer(value)
|
|
elif isinstance(value, float):
|
|
return Float(value)
|
|
elif isinstance(value, erl_term.ErlAtom):
|
|
if value == 'undefined':
|
|
return None
|
|
elif value == 'true':
|
|
return True
|
|
elif value == 'false':
|
|
return False
|
|
else:
|
|
return Atom(str(value))
|
|
elif isinstance(value, erl_term.ErlBinary):
|
|
return Binary(value.contents)
|
|
elif isinstance(value, tuple):
|
|
if len(value) == 2 and value[0] == '#S':
|
|
return String(value[1])
|
|
elif len(value) == 2 and value[0] == '#P':
|
|
l = [ [from_py_interface(v), from_py_interface(v)] for k, v in value[1] ]
|
|
return PropList(dict(l))
|
|
else:
|
|
return Tuple(tuple([ from_py_interface(v) for v in list(value) ]))
|
|
elif isinstance(value, list):
|
|
return List([ from_py_interface(v) for v in value ])
|
|
else:
|
|
raise RuntimeError, 'unknown object ~s' % repr(value)
|
|
|
|
## pyebf -> py_interface
|
|
def to_py_interface(value):
|
|
if value is None:
|
|
return erl_term.ErlAtom("undefined")
|
|
elif value is True:
|
|
return erl_term.ErlAtom("true")
|
|
elif value is False:
|
|
return erl_term.ErlAtom("false")
|
|
elif isinstance(value, int) or isinstance(value, long):
|
|
return erl_term.ErlNumber(value)
|
|
elif isinstance(value, float):
|
|
return erl_term.ErlNumber(value)
|
|
elif isinstance(value, Atom):
|
|
return erl_term.ErlAtom(value)
|
|
elif isinstance(value, String):
|
|
return erl_term.ErlTuple(['#S', erl_term.ErlList(value)])
|
|
elif isinstance(value, str):
|
|
return erl_term.ErlBinary(value)
|
|
elif isinstance(value, unicode):
|
|
return erl_term.ErlBinary(value)
|
|
elif isinstance(value, tuple):
|
|
return erl_term.ErlTuple([ to_py_interface(v) for v in list(value) ])
|
|
elif isinstance(value, list):
|
|
return erl_term.ErlList([ to_py_interface(v) for v in value ])
|
|
elif isinstance(value, dict):
|
|
l = [ erl_term.ErlTuple([to_py_interface(v), to_py_interface(v)]) for k, v in value.iteritems() ]
|
|
return erl_term.ErlTuple(['#T', erl_term.ErlList(l)])
|
|
else:
|
|
raise RuntimeError, 'unknown object ~s' % repr(value)
|