from functools import cached_property
from typing import Any
from pydantic import BaseModel, Field
from .locators import Locator, FrozenLocator
[документация]
class BaseState(BaseModel):
"""Base class for all states of state machine.
Fill free to inherite custom state class from BaseState with adding new attributes to Pydantic model scheme.
"""
state_class_locator: str = Field(
description='Path-like string specifies how to find required State class. '
'Will be initialized by router on state instance creation.',
)
class Config:
allow_mutation = False
validate_all = True # default values should be validated too
extra = 'ignore'
keep_untouched = (cached_property,)
[документация]
def enter_state(self) -> Locator | None:
"""Run any custom logic on state enter.
Can return state object to force state machine switching to another state.
"""
pass
[документация]
async def aenter_state(self) -> Locator | None:
"""Run any custom logic on state enter.
Can return state object to force state machine switching to another state.
"""
pass
[документация]
def exit_state(self, state_class_transition: bool) -> None:
"""Run any custom logic on state exit.
State machine switching to another state is not available from this method.
"""
pass
[документация]
async def aexit_state(self, state_class_transition: bool) -> None:
"""Run any custom logic on state exit.
State machine switching to another state is not available from this method.
"""
pass
[документация]
def process(self, event: Any) -> Locator | None:
"""Run any custom logic to process event.
Can return state object to force state machine switching to another state.
"""
pass
[документация]
async def aprocess(self, event: Any) -> Locator | None:
"""Run any custom logic to process event.
Can return state object to force state machine switching to another state.
"""
pass
@cached_property
def locator(self) -> Locator:
return FrozenLocator(
state_class_locator=self.state_class_locator,
params=self.dict(
exclude={'state_class_locator'},
by_alias=True,
exclude_defaults=True, # Make locators shorter
),
)