aboutsummaryrefslogtreecommitdiffstats
path: root/generat3d/config.py
diff options
context:
space:
mode:
Diffstat (limited to 'generat3d/config.py')
-rw-r--r--generat3d/config.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/generat3d/config.py b/generat3d/config.py
new file mode 100644
index 0000000..9ea7266
--- /dev/null
+++ b/generat3d/config.py
@@ -0,0 +1,56 @@
+# generat3D - evaluate Daz DSON scenes and write .dbz files
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import os
+import tomllib
+from pathlib import Path
+
+from . import Error
+
+KEYS = {"library_roots"}
+
+
+def config_path():
+ base = os.environ.get("XDG_CONFIG_HOME") or os.path.expanduser("~/.config")
+ return Path(base) / "generat3d" / "config.toml"
+
+
+def library_roots(cli_roots, path=None):
+ """Library roots from -L if given (replacing the config), else from the config file."""
+ path = Path(path) if path else config_path()
+ roots = list(cli_roots)
+ if not roots and path.exists():
+ try:
+ with open(path, "rb") as f:
+ data = tomllib.load(f)
+ except tomllib.TOMLDecodeError as e:
+ raise Error(f"{path}: {e}") from None
+ unknown = sorted(set(data) - KEYS)
+ if unknown:
+ raise Error(f"{path}: unknown keys: {', '.join(unknown)}")
+ roots = data.get("library_roots", [])
+ if not isinstance(roots, list) or not all(isinstance(r, str) for r in roots):
+ raise Error(f"{path}: library_roots must be a list of strings")
+ if not roots:
+ raise Error(f"no library roots: pass -L or set library_roots in {path}")
+ out = []
+ for r in roots:
+ p = Path(r).expanduser()
+ if not p.is_dir():
+ raise Error(f"library root not found: {p}")
+ out.append(p)
+ return out