from collections.abc import Iterator from dataclasses import dataclass from typing import Callable, Self, final, override from docker_compose.cfg.org_yaml import OrgDataYaml from docker_compose.cfg.replace import ReplaceDynamic, ReplaceStatic @final @dataclass(frozen=True, slots=True) class Org(ReplaceStatic): src = ReplaceDynamic("org") @final @dataclass(frozen=True, slots=True) class App(ReplaceStatic): src = ReplaceDynamic("name") @final @dataclass(frozen=True, slots=True) class Url(ReplaceStatic): src = ReplaceDynamic("url") @override def __str__(self) -> str: val = super(Url, self).__str__() if not val: return val return ".".join((val, "ccamper7", "net")) @final @dataclass(frozen=True, slots=True) class OrgData: org_app = Org.src.build_placeholder(App.src) app: App org: Org url: Url @classmethod def from_dict(cls, app: str, org: str, data: OrgDataYaml) -> Self: return cls( App(app), Org(org), Url(data.get("url")), ) @property def render_funcs(self) -> Iterator[Callable[[str], str]]: yield self.app yield self.org yield self.url @property def pre_render_funcs(self) -> Iterator[Callable[[str], str]]: yield self.org_app