package config import ( "encoding/json" "os" "path/filepath" ) type Config struct { ChannelID string `json:"channel_id"` CheckIntervalMinutes int `json:"check_interval_minutes"` MinecraftVersion string `json:"minecraft_version"` FabricLoaderVersion string `json:"fabric_loader_version"` LoaderMetaVersion string `json:"loader_meta_version"` JavaPath string `json:"java_path"` ServerLocation string `json:"server_location"` BackupLocation string `json:"backup_location"` MergePreCommand string `json:"merge_pre_command"` MergePostCommand string `json:"merge_post_command"` ModrinthMods []Mod `json:"modrinth_mods"` } type Mod struct { Slug string Version string } func (m Mod) Pinned() bool { return m.Version != "" } func (m Mod) MarshalJSON() ([]byte, error) { if m.Version == "" { return json.Marshal(m.Slug) } return json.Marshal(modObject{Slug: m.Slug, Version: m.Version}) } func (m *Mod) UnmarshalJSON(data []byte) error { var slug string if err := json.Unmarshal(data, &slug); err == nil { m.Slug = slug m.Version = "" return nil } var obj modObject if err := json.Unmarshal(data, &obj); err != nil { return err } m.Slug = obj.Slug m.Version = obj.Version return nil } type modObject struct { Slug string `json:"slug"` Version string `json:"version"` } const Dir = "config" func Path() string { return filepath.Join(Dir, "config.json") } func APIPath() string { return filepath.Join(Dir, "api.json") } func Load() (*Config, error) { data, err := os.ReadFile(Path()) if err != nil { return nil, err } var c Config if err := json.Unmarshal(data, &c); err != nil { return nil, err } return &c, nil } func Save(cfg *Config) error { if err := os.MkdirAll(Dir, 0o755); err != nil { return err } data, err := json.MarshalIndent(cfg, "", " ") if err != nil { return err } return os.WriteFile(Path(), append(data, '\n'), 0o644) }