from collections.abc import Iterable, Iterator from dataclasses import dataclass from typing import Self, final, override 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 @property def as_dict(self) -> NetArgsYaml: yaml_dict = NetArgsYaml( name=str(self), ) 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 @override def __str__(self) -> str: return f"{OrgData.org_app.old!s}_{self.name}" @property def external(self) -> bool: return self.name == "proxy" @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 str(net)[:-6]