mirror of
https://github.com/aljazceru/hummingbot-dashboard.git
synced 2026-01-01 04:24:24 +01:00
54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
import json
|
|
from decimal import Decimal
|
|
from enum import Enum
|
|
|
|
import yaml
|
|
|
|
|
|
class EnumEncoderDecoder:
|
|
|
|
def __init__(self, *enum_classes):
|
|
self.enum_classes = {enum_class.__name__: enum_class for enum_class in enum_classes}
|
|
|
|
def recursive_encode(self, value):
|
|
if isinstance(value, dict):
|
|
return {key: self.recursive_encode(val) for key, val in value.items()}
|
|
elif isinstance(value, list):
|
|
return [self.recursive_encode(val) for val in value]
|
|
elif isinstance(value, Enum):
|
|
return {"__enum__": True, "class": type(value).__name__, "value": value.name}
|
|
elif isinstance(value, Decimal):
|
|
return {"__decimal__": True, "value": str(value)}
|
|
else:
|
|
return value
|
|
|
|
def recursive_decode(self, value):
|
|
if isinstance(value, dict):
|
|
if value.get("__enum__"):
|
|
enum_class = self.enum_classes.get(value['class'])
|
|
if enum_class:
|
|
return enum_class[value["value"]]
|
|
elif value.get("__decimal__"):
|
|
return Decimal(value["value"])
|
|
else:
|
|
return {key: self.recursive_decode(val) for key, val in value.items()}
|
|
elif isinstance(value, list):
|
|
return [self.recursive_decode(val) for val in value]
|
|
else:
|
|
return value
|
|
|
|
def encode(self, d):
|
|
return json.dumps(self.recursive_encode(d))
|
|
|
|
def decode(self, s):
|
|
return self.recursive_decode(json.loads(s))
|
|
|
|
|
|
def yaml_dump(self, d, file_path):
|
|
with open(file_path, 'w') as file:
|
|
yaml.dump(self.recursive_encode(d), file)
|
|
|
|
def yaml_load(self, file_path):
|
|
with open(file_path, 'r') as file:
|
|
return self.recursive_decode(yaml.safe_load(file))
|