import ctypes
class ErrorCode:
ERROR_NONE = 0
ERROR_WRONGTYPE = -1
ERROR_NOTDEFINED = -2
ERROR_INVALIDSTRING = -3
ERROR_EVALERROR = -4
class YamlType:
INTEGER = 0
REAL = 1
STRING = 2
BOOLEAN = 3
ARRAY = 4
HASH = 5
NULL = 6
def yaml_type_to_str(yaml):
if yaml == YamlType.INTEGER:
return 'Integer'
elif yaml == YamlType.REAL:
return 'Real'
elif yaml == YamlType.STRING:
return 'String'
elif yaml == YamlType.BOOLEAN:
return 'Boolean'
elif yaml == YamlType.ARRAY:
return 'Array'
elif yaml == YamlType.HASH:
return 'Hash'
elif yaml == YamlType.NULL:
return 'Null'
else:
return 'Unknown type'
class Environment(ctypes.Structure):
pass
class Yaml(ctypes.Structure):
pass
class IntReturnType(ctypes.Structure):
_fields_ = [("value", ctypes.c_int),
("error", ctypes.c_int)]
class StringReturnType(ctypes.Structure):
_fields_ = [("value", ctypes.c_char_p),
("error", ctypes.c_int)]
class DecimalReturnType(ctypes.Structure):
_fields_ = [("value", ctypes.c_double),
("error", ctypes.c_int)]
class ArrayStringReturnType(ctypes.Structure):
_fields_ = [("value", ctypes.POINTER(ctypes.c_char_p)),
("length", ctypes.c_int),
("error", ctypes.c_int)]
env_p = ctypes.POINTER(Environment)
yaml_p = ctypes.POINTER(Yaml)
class YamlReturnType(ctypes.Structure):
_fields_ = [("value", yaml_p),
("error", ctypes.c_int)]
def ffi_function_signatures(lib):
lib.environment_create.restype = env_p
lib.environment_set_integer.argtypes = [env_p, ctypes.c_char_p, ctypes.c_int]
lib.environment_get_integer.argtypes = [env_p, ctypes.c_char_p]
lib.environment_get_integer.restype = IntReturnType
lib.environment_set_string.argtypes = [env_p, ctypes.c_char_p, ctypes.c_char_p]
lib.environment_get_string.argtypes = [env_p, ctypes.c_char_p]
lib.environment_get_string.restype = StringReturnType
lib.environment_set_decimal.argtypes = [env_p, ctypes.c_char_p, ctypes.c_double]
lib.environment_get_decimal.argtypes = [env_p, ctypes.c_char_p]
lib.environment_get_decimal.restype = DecimalReturnType
lib.yaml_create_from_string.argtypes = [ctypes.c_char_p]
lib.yaml_create_from_string.restype = YamlReturnType
lib.yaml_destroy.argtypes = [yaml_p]
lib.yaml_evaluate.argtypes = [yaml_p, env_p]
lib.yaml_evaluate.restype = YamlReturnType
lib.yaml_type.argtypes = [yaml_p]
lib.yaml_type.restype = ctypes.c_int
lib.yaml_integer_get.argtypes = [yaml_p]
lib.yaml_integer_get.restype = IntReturnType
lib.yaml_decimal_get.argtypes = [yaml_p]
lib.yaml_decimal_get.restype = DecimalReturnType
lib.yaml_string_get.argtypes = [yaml_p]
lib.yaml_string_get.restype = StringReturnType
lib.yaml_hash_keys.argtypes = [yaml_p]
lib.yaml_hash_keys.restype = ArrayStringReturnType
lib.yaml_hash_get.argtypes = [yaml_p, ctypes.c_char_p]
lib.yaml_hash_get.restype = YamlReturnType
lib.yaml_array_len.argtypes = [yaml_p]
lib.yaml_array_len.restype = IntReturnType
lib.yaml_array_get.argtypes = [yaml_p, ctypes.c_int]
lib.yaml_array_get.restype = YamlReturnType