from collections.abc import (
    MutableMapping,
)
from typing import (
    Any,
)
from minos.common import (
    BucketModel,
    Field,
)
[docs]class SagaContext(BucketModel, MutableMapping):
    """Saga Context class
    The purpose of this class is to keep an execution state.
    """
[docs]    def __init__(self, **kwargs):
        if "fields" not in kwargs:
            fields = {name: Field(name, Any, value) for name, value in kwargs.items()}
        else:
            fields = {name: Field(field.name, Any, field.value) for name, field in kwargs["fields"].items()}
        super().__init__(fields=fields) 
    def __setitem__(self, key: str, value: Any) -> None:
        try:
            super().__setitem__(key, value)
        except KeyError:
            self._fields[key] = Field(key, Any, value)
    def __delitem__(self, item: str) -> None:
        try:
            del self._fields[item]
        except KeyError:
            raise KeyError(f"{type(self).__name__!r} does not contain the {item!r} field")
    def __setattr__(self, key: str, value: Any) -> None:
        try:
            super().__setattr__(key, value)
        except AttributeError:
            self[key] = value
    def __delattr__(self, item: str) -> None:
        if item.startswith("_"):
            super().__delattr__(item)
            return
        try:
            del self[item]
        except KeyError as exc:
            raise AttributeError(str(exc))