Source code for codegen.target

import importlib.metadata
from dataclasses import dataclass, field
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from collections.abc import Mapping
    from pathlib import Path

    from codegen.config import CodegenConfig


ENTRY_POINT_GROUP = "codegen.targets"


@dataclass(frozen=True)
class Output:
    language: str
    output_type: str


[docs] @dataclass(frozen=True) class Target: name: str schema: type[CodegenConfig] template_path: Path output_types: tuple[Output, ...] jsonnet_stdlib_dir: Path | None = None env_globals: Mapping[str, object] = field(default_factory=dict) def __post_init__(self) -> None: if not self.output_types: raise ValueError(f"Target {self.name!r} has no output types") if len(set(self.output_types)) != len(self.output_types): raise ValueError(f"Target {self.name!r} has duplicate output types") def output_for(self, output_type: str) -> Output: for output in self.output_types: if output.output_type == output_type: return output raise ValueError( f"Target {self.name!r} does not support output type {output_type!r}" )
[docs] def discover_targets() -> list[Target]: eps = importlib.metadata.entry_points(group=ENTRY_POINT_GROUP) return [ep.load() for ep in eps]