beach.config._shared のソースコード
"""Shared configuration errors, key sets, and structural/value validation."""
from __future__ import annotations
from collections.abc import Mapping
from typing import Any
CONFIG_FILENAME = "beach.toml"
SCHEMA_BASE_URL = "https://raw.githubusercontent.com/Nkzono99/BEACH/main/schemas"
BEACH_SCHEMA_URL = f"{SCHEMA_BASE_URL}/beach.schema.json"
TOP_LEVEL_CONFIG_ORDER = (
"sim",
"domain",
"field_boundary",
"particle_boundary",
"reservoir",
"surface_current_model",
"periodic2",
"particles",
"mesh",
"output",
)
SCHEMA_DIRECTIVE = f"#:schema {BEACH_SCHEMA_URL}"
_FACE_SOURCE_MODES = frozenset({"photo_raycast"})
[ドキュメント]
class ConfigError(ValueError):
"""Base error for BEACH config handling."""
[ドキュメント]
class ConfigValidationError(ConfigError):
"""Raised when ``beach.toml`` violates known BEACH constraints."""
def _validate_high_level_fragment(
document: Mapping[str, Any],
*,
context: str,
) -> None:
domain = document.get("domain")
if isinstance(domain, Mapping):
if "box_origin" in domain and "box_min" in domain:
raise ConfigError(
f"{context} error: domain.box_origin and domain.box_min cannot be specified "
"in the same fragment."
)
if "box_size" in domain and "box_max" in domain:
raise ConfigError(
f"{context} error: domain.box_size and domain.box_max cannot be specified "
"in the same fragment."
)
particles = document.get("particles")
species = particles.get("species") if isinstance(particles, Mapping) else None
if isinstance(species, list):
for index, item in enumerate(species, start=1):
if not isinstance(item, Mapping):
continue
if not any(
key in item for key in ("inject_region_mode", "uv_low", "uv_high")
):
continue
source_mode = item.get("source_mode", "volume_seed")
if (
not isinstance(source_mode, str)
or source_mode not in _FACE_SOURCE_MODES
):
raise ConfigError(
f"{context} error: particles.species[{index}] uses source.region_mode/source.uv_* "
f'but particles.species[{index}].source.mode must be "photo_raycast".'
)
def _is_array_of_tables(value: object) -> bool:
return (
isinstance(value, list)
and len(value) > 0
and all(isinstance(item, Mapping) for item in value)
)