Source code for varlord.sources.json
"""
JSON source.
Loads configuration from JSON files.
Only loads keys that map to fields defined in the model.
Uses standard library json module (no extra dependencies).
"""
from __future__ import annotations
import json
from typing import Any, Optional, Type
from varlord.sources.file_base import FileSource
[docs]
class JSON(FileSource):
"""Source that loads configuration from JSON files.
Uses standard library json module (no extra dependencies).
Only loads keys that map to fields defined in the model.
Model is required and will be auto-injected by Config.
Example:
>>> @dataclass
... class Config:
... host: str = field()
>>> # config.json: {"host": "0.0.0.0"}
>>> source = JSON("config.json", model=Config)
>>> source.load()
{'host': '0.0.0.0'}
"""
[docs]
def __init__(
self,
file_path: str,
model: Optional[Type[Any]] = None,
source_id: Optional[str] = None,
required: bool = False,
):
"""Initialize JSON source.
Args:
file_path: Path to JSON file
model: Optional model for field filtering
source_id: Optional unique identifier (default: auto-generated from path)
required: If True, raise error when file not found
"""
super().__init__(file_path, model=model, source_id=source_id, required=required)
@property
def name(self) -> str:
"""Return source name."""
return "json"
def _load_file_content(self) -> Any:
"""Load and parse JSON file.
Returns:
Parsed JSON content (dict, list, etc.)
Raises:
FileNotFoundError: If file not found
json.JSONDecodeError: If JSON is invalid
"""
with open(self._file_path, encoding="utf-8") as f:
return json.load(f) or {}