package budget import ( "encoding/json" "os" "path/filepath" ) type paths struct { config string units string state string } func homePaths(home string) paths { return paths{ config: filepath.Join(home, ".config/budget/profiles.toml"), units: filepath.Join(home, ".config/systemd/user"), state: filepath.Join(home, ".local/state/budget"), } } func writeFiles(p paths, files map[string]string) error { if err := os.MkdirAll(p.state, 0755); err != nil { return err } manifest := filepath.Join(p.state, "files.json") previous := []string{} data, err := os.ReadFile(manifest) if err != nil && !os.IsNotExist(err) { return err } if err == nil { if err := json.Unmarshal(data, &previous); err != nil { return err } } for _, relative := range previous { if _, keep := files[relative]; !keep { if err := os.Remove(filepath.Join(p.units, relative)); err != nil && !os.IsNotExist(err) { return err } } } for _, relative := range keys(files) { target := filepath.Join(p.units, relative) if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil { return err } if err := os.WriteFile(target, []byte(files[relative]), 0644); err != nil { return err } } data, err = json.MarshalIndent(keys(files), "", " ") if err != nil { return err } return os.WriteFile(manifest, append(data, '\n'), 0644) }