Mod loading, disgusting struct parsing

This commit is contained in:
comp500
2019-04-27 16:54:27 +01:00
parent db7c837bfa
commit 5f92843226
5 changed files with 87 additions and 7 deletions

15
core/interfaces.go Normal file
View File

@@ -0,0 +1,15 @@
package core
// UpdateParsers stores all the update parsers that packwiz can use. Add your own update systems to this map.
var UpdateParsers map[string]UpdateParser = make(map[string]UpdateParser)
// UpdateParser takes an unparsed interface{}, and returns an Updater for a mod file
type UpdateParser interface {
ParseUpdate(interface{}) (Updater, error)
}
// Updater checks for and does updates on a mod
type Updater interface {
// DoUpdate returns true if an update was done, false otherwise
DoUpdate(Mod) (bool, error)
}

View File

@@ -1,5 +1,9 @@
package core
import "github.com/BurntSushi/toml"
import (
"errors"
"github.com/BurntSushi/toml"
)
// Mod stores metadata about a mod. This is written to a TOML file for each mod.
type Mod struct {
@@ -13,7 +17,7 @@ type Mod struct {
HashFormat string `toml:"hash-format"`
Hash string `toml:"hash"`
} `toml:"download"`
Update map[string]toml.Primitive `toml:"update"`
Update map[string]interface{} `toml:"update"`
}
// The three possible values of Side (the side that the mod is on) are "server", "client", and "both".
@@ -23,6 +27,28 @@ const (
UniversalSide = "both"
)
// LoadMod attempts to load a mod file from a path
func LoadMod(modFile string) (Mod, error) {
var mod Mod
if _, err := toml.DecodeFile(modFile, &mod); err != nil {
return Mod{}, err
}
// Horrible reflection library to convert to Updaters
for k, v := range mod.Update {
updateParser, ok := UpdateParsers[k]
if ok {
updater, err := updateParser.ParseUpdate(v)
if err != nil {
return mod, err
}
mod.Update[k] = updater
} else {
return mod, errors.New("Update plugin " + k + " not found!")
}
}
return mod, nil
}
func (m Mod) Write() {
}