Add schema utility

This commit is contained in:
wqy
2022-09-24 22:59:45 +08:00
parent 1a584424d9
commit 1938d3d522

74
api/schema.py Normal file
View File

@@ -0,0 +1,74 @@
from typing import Any
float_type = type(0.0).__name__
str_type = type('').__name__
server_point_type = type((0.0,0.0)).__name__
client_point_type = type({'x': 0.0, 'y': 0.0}).__name__
str_list_type = type(['']).__name__
def define_property(type: str, optional: bool = False, readonly: bool = False) -> dict[str, Any]:
return { 'type': type, 'optional': optional, 'readonly': readonly }
class Serialize(object):
def __init__(self, row, schema) -> None:
self.row = row
self.schema = schema
def to_execution(self, name) -> str:
value = self.row[name]
type = self.schema[name]['type']
if value == None:
return 'null'
if type == float_type:
return value
if type == str_type:
return f"'{value}'"
raise Exception(f"Fail to serialize {name} for execution!")
def to_storage(self, name) -> str:
value = self.row[name]
type = self.schema[name]['type']
if value == None:
return 'null'
if type == float_type:
return value
if type == str_type:
return f"''{value}''"
raise Exception(f"Fail to serialize {name} for storage!")
def to_execution(self):
row = self.row.copy()
for key, value in row.items():
if value == None:
row[key] = 'null'
elif self.schema[key]['type'] == str_type:
row[key] = f"'{row[key]}'"
elif self.schema[key]['type'] == client_point_type:
row[key] = f"'({value['x']},{value['y']})'"
return row
def to_storage(self):
row = self.row.copy()
for key, value in row.items():
if value == None:
row[key] = 'null'
elif self.schema[key] == str_type:
row[key] = f"''{row[key]}''"
elif self.schema[key]['type'] == client_point_type:
row[key] = f"''({value['x']},{value['y']})''"
return row