from typing import Generic, TypeVar, Optional, List
from pydantic import BaseModel, validator
from pydantic.generics import GenericModel
DataT = TypeVar('DataT')
[docs]class Error(BaseModel):
"""HTTP error representation."""
code: int
message: str
[docs]class DataModel(BaseModel):
"""Payload representation."""
numbers: List[int]
people: List[str]
[docs]class Response(GenericModel, Generic[DataT]):
"""HTTP Response representation."""
data: Optional[DataT]
error: Optional[Error]
[docs] @validator('error', always=True)
def check_consistency(cls, v, values):
if v is not None and values['data'] is not None:
raise ValueError('must not provide both data and error')
if v is None and values.get('data') is None:
raise ValueError('must provide data or error')
return v