# generat3D - evaluate Daz DSON scenes and write .dbz files # Copyright (C) 2026 Danilo M. # # 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 except OSError as e: raise Error(f"{path}: {e.strerror or 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: if not r.strip(): raise Error("empty library root") try: p = Path(r).expanduser() except RuntimeError: raise Error(f"cannot expand library root: {r}") from None if not p.is_dir(): raise Error(f"library root not found: {p}") out.append(p) return out