chultun/internal/budget/files.go

59 lines
1.3 KiB
Go

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)
}