2022-01-08 22:24:34 -09:00
|
|
|
from typing import TypeVar
|
2021-11-25 14:17:02 -09:00
|
|
|
|
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
|
|
|
|
T = TypeVar("T", bound=BaseModel)
|
|
|
|
|
U = TypeVar("U", bound=BaseModel)
|
|
|
|
|
|
|
|
|
|
|
2022-01-08 22:24:34 -09:00
|
|
|
def mapper(source: U, dest: T, **_) -> T:
|
2021-11-25 14:17:02 -09:00
|
|
|
"""
|
|
|
|
|
Map a source model to a destination model. Only top-level fields are mapped.
|
|
|
|
|
"""
|
|
|
|
|
|
2024-02-11 10:47:37 -06:00
|
|
|
for field in source.model_fields:
|
|
|
|
|
if field in dest.model_fields:
|
2021-11-25 14:17:02 -09:00
|
|
|
setattr(dest, field, getattr(source, field))
|
|
|
|
|
|
|
|
|
|
return dest
|
2022-01-08 22:24:34 -09:00
|
|
|
|
|
|
|
|
|
2022-03-15 15:01:56 -08:00
|
|
|
def cast(source: U, dest: type[T], **kwargs) -> T:
|
2024-02-11 10:47:37 -06:00
|
|
|
create_data = {field: getattr(source, field) for field in source.model_fields if field in dest.model_fields}
|
2022-01-08 22:24:34 -09:00
|
|
|
create_data.update(kwargs or {})
|
|
|
|
|
return dest(**create_data)
|