"""Defines object schemas for instantiated generic elements."""
from abc import ABC
from typing import List, Optional
from uuid import UUID, uuid4
from fastapi_camelcase import CamelModel
from pydantic import Field
from typing_extensions import Literal
from ...resources import ClassOfSupply, Environment
from ..element import ElementType
from ..state import State
class InstElementUUID(CamelModel):
"""
Instantiated element referenced by unique identifier.
"""
id: UUID = Field(default_factory=uuid4, description="Unique identifier")
[docs]class InstElement(InstElementUUID):
"""
Generic element instance.
"""
type: Literal[ElementType.ELEMENT] = Field(
ElementType.ELEMENT, description="element type"
)
template_id: UUID = Field(..., description="Element template unique identifier")
name: str = Field(..., title="Name", description="Element name")
description: Optional[str] = Field(
title="Description", description="Short description (optional)"
)
class_of_supply: Optional[ClassOfSupply] = Field(
title="Class of Supply", description="Class of supply"
)
environment: Optional[Environment] = Field(
title="Environment", description="Required stowage environment"
)
accommodation_mass: Optional[float] = Field(
title="Accommodation Mass",
description="Amount of COS 5 (kg) required for stowage",
ge=0,
)
mass: Optional[float] = Field(title="Mass", description="Mass (kg)", ge=0)
volume: Optional[float] = Field(title="Volume", description="Volume (m^3)", ge=0)
states: Optional[List[State]] = Field(
title="States", description="List of operational states"
)
current_state_index: Optional[int] = Field(
title="Current State",
description="Index of the current operational state",
ge=-1,
)
parts: Optional[List[UUID]] = Field(
title="Parts", description="List of constituent parts"
)
icon: Optional[str] = Field(title="Icon")
class InstCargoCarrier(InstElement, ABC):
"""
Abstract base class for a carrier of cargo, elements or resources.
"""
max_cargo_mass: Optional[float] = Field(
title="Max Cargo Mass", description="Cargo mass capacity constraint (kg)", ge=0
)
max_cargo_volume: Optional[float] = Field(
title="Maximum Cargo Volume",
description="Cargo volume capacity constraint (m^3)",
ge=0,
)
cargo_environment: Optional[Environment] = Field(
title="Cargo Environment",
description="Cargo stowage environment",
)