feat(common): Policy load_from_dir + save_local with last-wins merge

Lands plan tasks 2.3 (single-file load), 2.4 (multi-file merge cases — last-wins,
lex order, non-conf skip, missing-dir default), and 2.5 (save_local preserves
sibling files) as one logical unit.

- load_from_dir: reads *.conf in lex-ascending order, parses TOML, merges via
  last-wins on stack key, storage block, and firstrun block. Missing dir yields
  Policy::default(). Non-.conf entries silently skipped.
- save_local: writes 50-local.conf with toml::to_string_pretty; never reads
  or removes siblings. Created via create_dir_all.
- 6 parse tests added: load_single_file, last_file_wins_on_overlap,
  lex_order_not_filesystem_order, ignores_non_conf_files, missing_dir_yields_default,
  save_local_preserves_sibling_files.
This commit is contained in:
michael
2026-04-27 06:23:49 -07:00
parent dc2c4b02cb
commit 9be8e4d0b3
2 changed files with 200 additions and 0 deletions

View File

@@ -10,3 +10,6 @@ serde_json = { workspace = true }
toml = { workspace = true }
thiserror = { workspace = true }
zvariant = { workspace = true }
[dev-dependencies]
tempfile = { workspace = true }