from collections.abc import Iterable, Iterator from dataclasses import dataclass, field from typing import Self, final from docker_compose.cfg.org import OrgData from docker_compose.compose.net_yaml import NetArgsYaml, NetYaml from docker_compose.compose.services import Service @final @dataclass(frozen=True, slots=True) class NetArgs: name: str full_name: str = field(init=False) external: bool = field(init=False) def __post_init__(self): setter = super(NetArgs, self).__setattr__ setter("full_name", f"{OrgData.org_app.dest}_{self.name}") setter("external", self.name == "proxy") @property def as_dict(self) -> NetArgsYaml: yaml_dict = NetArgsYaml( name=self.full_name, ) if self.external: yaml_dict["external"] = self.external return yaml_dict # @property # def as_key_dict(self) -> tuple[str, NetArgsYaml]: # return str(self), self.as_dict @final @dataclass class Net: data: frozenset[NetArgs] @classmethod def from_service_list(cls, args: Iterable[Service]) -> Self: return cls.from_list( frozenset(net for service in args for net in service.networks) ) @classmethod def from_list(cls, args: frozenset[str]) -> Self: return cls(frozenset(NetArgs(arg) for arg in args)) @property def as_dict(self) -> NetYaml: return {net.name: net.as_dict for net in self.data} @property def proxys(self) -> Iterator[str]: for net in self.data: if not net.external: continue yield net.full_name[:-6]