From f23f99b5bee49e8eeb4c3386cdb673336fa3d88d Mon Sep 17 00:00:00 2001 From: comp500 Date: Sat, 11 May 2019 14:40:59 +0100 Subject: [PATCH] Fix struct tagging by just using string keys --- core/interfaces.go | 2 +- core/mod.go | 19 +++++++++++-------- curseforge/curseforge.go | 22 ++++++++++++++++------ 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/core/interfaces.go b/core/interfaces.go index 238879d..9ca5bf6 100644 --- a/core/interfaces.go +++ b/core/interfaces.go @@ -5,7 +5,7 @@ var UpdateParsers = make(map[string]UpdateParser) // UpdateParser takes an unparsed interface{} (as a map[string]interface{}), and returns an Updater for a mod file. // This can be done using the mapstructure library or your own parsing methods. type UpdateParser interface { - ParseUpdate(interface{}) (Updater, error) + ParseUpdate(map[string]interface{}) (Updater, error) } // Updater checks for and does updates on a mod diff --git a/core/mod.go b/core/mod.go index aedb42d..ca6d697 100644 --- a/core/mod.go +++ b/core/mod.go @@ -8,13 +8,15 @@ import ( // Mod stores metadata about a mod. This is written to a TOML file for each mod. type Mod struct { - metaFile string // The file for the metadata file, used as an ID - Name string `toml:"name"` - FileName string `toml:"filename"` - Side string `toml:"side,omitempty"` - Optional bool `toml:"optional,omitempty"` - Download ModDownload `toml:"download"` - Update map[string]interface{} `toml:"update"` + metaFile string // The file for the metadata file, used as an ID + Name string `toml:"name"` + FileName string `toml:"filename"` + Side string `toml:"side,omitempty"` + Optional bool `toml:"optional,omitempty"` + Download ModDownload `toml:"download"` + // Update is a map of map of stuff, so you can store arbitrary values on string keys to define updating + Update map[string]map[string]interface{} `toml:"update"` + updaters map[string]Updater } // ModDownload specifies how to download the mod file @@ -37,6 +39,7 @@ func LoadMod(modFile string) (Mod, error) { if _, err := toml.DecodeFile(modFile, &mod); err != nil { return Mod{}, err } + mod.updaters = make(map[string]Updater) // Horrible reflection library to convert to Updaters for k, v := range mod.Update { updateParser, ok := UpdateParsers[k] @@ -45,7 +48,7 @@ func LoadMod(modFile string) (Mod, error) { if err != nil { return mod, err } - mod.Update[k] = updater + mod.updaters[k] = updater } else { return mod, errors.New("Update plugin " + k + " not found!") } diff --git a/curseforge/curseforge.go b/curseforge/curseforge.go index 30b73a7..6ca21a0 100644 --- a/curseforge/curseforge.go +++ b/curseforge/curseforge.go @@ -1,4 +1,5 @@ package curseforge + import ( "errors" "fmt" @@ -147,13 +148,16 @@ func cmdInstall(flags core.Flags, mod string, modArgsTail []string) error { fileInfo, err := getFileInfo(modID, fileID) - updateMap := make(map[string]interface{}) + updateMap := make(map[string]map[string]interface{}) - updateMap["curseforge"] = cfUpdater{ + updateMap["curseforge"], err = cfUpdater{ ProjectID: modID, FileID: fileID, // TODO: determine update channel ReleaseChannel: "release", + }.ToMap() + if err != nil { + return err } modMeta := core.Mod{ @@ -176,19 +180,25 @@ func cmdInstall(flags core.Flags, mod string, modArgsTail []string) error { type cfUpdateParser struct{} -func (u cfUpdateParser) ParseUpdate(updateUnparsed interface{}) (core.Updater, error) { +func (u cfUpdateParser) ParseUpdate(updateUnparsed map[string]interface{}) (core.Updater, error) { var updater cfUpdater err := mapstructure.Decode(updateUnparsed, &updater) return updater, err } type cfUpdater struct { - ProjectID int `mapstructure:"project-id" toml:"project-id"` - FileID int `mapstructure:"file-id" toml:"file-id"` - ReleaseChannel string `mapstructure:"release-channel" toml:"release-channel"` + ProjectID int `mapstructure:"project-id"` + FileID int `mapstructure:"file-id"` + ReleaseChannel string `mapstructure:"release-channel"` } func (u cfUpdater) DoUpdate(mod core.Mod) (bool, error) { return false, nil } +func (u cfUpdater) ToMap() (map[string]interface{}, error) { + newMap := make(map[string]interface{}) + err := mapstructure.Decode(u, &newMap) + return newMap, err +} +