mirror of
https://github.com/sol1/rustguac.git
synced 2026-09-10 17:47:13 +00:00
a57581ceef
Themes were a Vec hardcoded in src/config.rs (builtin_presets()) - every new preset required editing Rust, recompiling, and shipping a new release, for what is purely presentation data. PR #148 from @dav0l surfaced this nicely by failing to compile on a brace count in the array. This change adds a config::load_themes(&static_path) loader that starts from the eight built-in presets (unchanged) and then merges in any *.toml files from <static_path>/themes/. Disk themes can add new entries or override a built-in by using the same name; the existing builtin_presets() remains as the always-available fallback when the themes directory is missing or empty. File format: flat TOML table, one file per theme, filename (minus extension) is the theme id. See static/themes/catppuccin-macchiato.toml for a full example. Theme names are validated against the same allowlist we use for Vault entry names ([a-zA-Z0-9_-]{1,64}) so they are safe to render in the UI picker and in log lines, and can't be used for path traversal or homoglyph mischief via crafted filenames. dav0l's Catppuccin Macchiato palette lands here as static/themes/catppuccin-macchiato.toml - their submission is the first user-contributed theme under the new mechanism. Closes #148. Backward compatibility: explicit. ThemeConfig::resolve() is now a thin wrapper over resolve_with(builtins), so existing test callers and any production callers see no behavioural change. Existing [theme] sections in user config.toml files - preset only, preset + overrides, overrides only, empty section, typo'd preset - all resolve byte-equal to 1.7.0 (verified by the new existing_user_config_with_theme_section_keeps_working_after_upgrade test). Eight new tests in total cover the loader, the override behaviour, the filename validation, and the upgrade scenario. Docs broken out: themes get docs/themes.md (the full reference); docs/configuration.md is trimmed to a brief stub and pointer. No build-system changes needed - debian/rules, install.sh and the Dockerfile all use recursive `cp -r static/` so the new themes subdirectory is picked up automatically.