1
0
mirror of https://github.com/ubf/ubf.git synced 2026-04-16 17:55:48 +00:00
Files
ubf/priv/python/pyubf_py_interface.py
Joseph Wayne Norton 06966fd372 misc. tiny cleanups
2010-07-12 09:58:25 +09:00

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)