aboutsummaryrefslogtreecommitdiffstats
path: root/generat3d/config.py
blob: 804723fbc9413273b9f7f292e961440e92f9caef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 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
        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")
        p = Path(r).expanduser()
        if not p.is_dir():
            raise Error(f"library root not found: {p}")
        out.append(p)
    return out