···
+
Lexicon JSON to Data Model Converter
+
Provides bidirectional conversion between Lexicon JSON schemas and Python data models.
+
from typing import Any, Dict, Type, Union, TypeVar
+
from pydantic import BaseModel
+
from .exceptions import ValidationError, SerializationError
+
from .types.primitive import NullModel, BooleanModel, IntegerModel
+
from .types.string import StringModel
+
from .types.complex import ArrayModel, ObjectModel, ParamsModel
+
from .types.reference import TokenModel, RefModel, UnionModel
+
from .types.special import (
+
UnknownModel, RecordModel, QueryModel,
+
ProcedureModel, SubscriptionModel
+
class LexiconConverter:
+
Bidirectional converter between Lexicon JSON and Python data models.
+
modelMap (Dict[str, Type[BaseModel]]): Mapping from Lexicon types to model classes
+
"boolean": BooleanModel,
+
"integer": IntegerModel,
+
"unknown": UnknownModel,
+
"procedure": ProcedureModel,
+
"subscription": SubscriptionModel,
+
def fromLexicon(cls, lexiconJson: Union[str, Dict[str, Any]]) -> BaseModel:
+
Convert Lexicon JSON to Python data model instance.
+
lexiconJson: Lexicon JSON string or dict
+
Instance of appropriate Pydantic model
+
ValidationError: If JSON is invalid or doesn't match schema
+
SerializationError: If conversion fails
+
if isinstance(lexiconJson, str):
+
data = json.loads(lexiconJson)
+
except json.JSONDecodeError as e:
+
raise ValidationError("lexiconJson", f"Invalid JSON: {e}")
+
if not isinstance(data, dict):
+
raise ValidationError("lexiconJson", "Lexicon must be a JSON object")
+
raise ValidationError("type", "Lexicon definition must have 'type' field")
+
typeName = data["type"]
+
if typeName not in cls.modelMap:
+
raise ValidationError("type", f"Unknown Lexicon type: {typeName}")
+
modelClass = cls.modelMap[typeName]
+
return modelClass(**data)
+
raise SerializationError(typeName, f"Failed to create model: {e}")
+
def toLexicon(cls, modelInstance: BaseModel) -> Dict[str, Any]:
+
Convert Python model instance back to Lexicon JSON format.
+
modelInstance: Instance of a Lexicon model
+
Dictionary representing Lexicon JSON
+
SerializationError: If conversion fails
+
if not isinstance(modelInstance, BaseModel):
+
raise SerializationError("modelInstance", "Input must be a Pydantic model")
+
# Get the model's type name by reverse lookup
+
for typeName, modelClass in cls.modelMap.items():
+
if isinstance(modelInstance, modelClass):
+
raise SerializationError("modelInstance", "Unknown model type")
+
# Convert to dict and add type field
+
result = modelInstance.model_dump(exclude_unset=True)
+
result["type"] = modelType
+
if modelType == "record" and "type" in result:
+
result["$type"] = result.pop("type")
+
raise SerializationError("toLexicon", f"Failed to serialize model: {e}")
+
def validateLexicon(cls, lexiconJson: Union[str, Dict[str, Any]]) -> bool:
+
Validate Lexicon JSON against schema definitions.
+
lexiconJson: Lexicon JSON to validate
+
True if valid, False otherwise
+
cls.fromLexicon(lexiconJson)
+
except (ValidationError, SerializationError):