|
1 | 1 | from pathlib import Path
|
2 | 2 | from typing import Any, Generic, Optional, TypeVar, Union, overload
|
3 | 3 |
|
| 4 | +import orjson |
4 | 5 | import yaml
|
5 | 6 |
|
6 | 7 | _T = TypeVar("_T")
|
@@ -44,3 +45,39 @@ def __len__(self) -> int:
|
44 | 45 |
|
45 | 46 | def all(self) -> dict[str, Union[_T, Any]]:
|
46 | 47 | return self._config
|
| 48 | + |
| 49 | + |
| 50 | +class OptionsHelp(Generic[_T]): |
| 51 | + def __init__(self, path: Path): |
| 52 | + self.path = path |
| 53 | + self._config: dict[str, Union[_T, Any]] = {} |
| 54 | + self.load_from_file() |
| 55 | + |
| 56 | + def load_from_file(self) -> None: |
| 57 | + try: |
| 58 | + with open(self.path, "r") as f: |
| 59 | + self._config: dict[str, Union[_T, Any]] = orjson.loads(f.read()) |
| 60 | + except FileNotFoundError: |
| 61 | + self._config = {} |
| 62 | + |
| 63 | + @overload |
| 64 | + def get(self, key: Any) -> Optional[Union[_T, Any]]: ... |
| 65 | + |
| 66 | + @overload |
| 67 | + def get(self, key: Any, default: Any) -> Union[_T, Any]: ... |
| 68 | + |
| 69 | + def get(self, key: Any, default: Any = None) -> Optional[Union[_T, Any]]: |
| 70 | + """Retrieves a config entry.""" |
| 71 | + return self._config.get(str(key), default) |
| 72 | + |
| 73 | + def __contains__(self, item: Any) -> bool: |
| 74 | + return str(item) in self._config |
| 75 | + |
| 76 | + def __getitem__(self, item: Any) -> Union[_T, Any]: |
| 77 | + return self._config[str(item)] |
| 78 | + |
| 79 | + def __len__(self) -> int: |
| 80 | + return len(self._config) |
| 81 | + |
| 82 | + def all(self) -> dict[str, Union[_T, Any]]: |
| 83 | + return self._config |
0 commit comments