z_mirror/fmm

git clone https://git.raiguard.me/z_mirror/fmm

Caleb HeuerUnmarshal mod list into Version, compare versions before deduplication1dcda80

predep-parsing
1.6 KiB90 linesraw
1package main
2
3import (
4	"encoding/json"
5	"io/fs"
6	"os"
7)
8
9type ModList struct {
10	Mods []ModListMod `json:"mods"`
11	path string
12}
13
14type ModListMod struct {
15	Name    string   `json:"name"`
16	Enabled bool     `json:"enabled"`
17	Version *Version `json:"version,omitempty"`
18}
19
20func newModList(path string) (*ModList, error) {
21	file, err := os.ReadFile(path)
22	if err != nil {
23		return nil, err
24	}
25	list := ModList{path: path}
26	err = json.Unmarshal(file, &list)
27	if err != nil {
28		return nil, err
29	}
30	return &list, nil
31}
32
33func (l *ModList) isEnabled(name string) bool {
34	for i := range l.Mods {
35		mod := &l.Mods[i]
36		if mod.Name == name {
37			return mod.Enabled
38		}
39	}
40	return false
41}
42
43func (l *ModList) save() error {
44	marshaled, err := json.MarshalIndent(l, "", "  ")
45	if err != nil {
46		return err
47	}
48	err = os.WriteFile(l.path, marshaled, fs.ModeExclusive)
49	return err
50}
51
52func (l *ModList) add(name string) *ModListMod {
53	l.Mods = append(l.Mods, ModListMod{name, true, nil})
54	return &l.Mods[len(l.Mods)-1]
55}
56
57func (l *ModList) disable(name string) {
58	for i := range l.Mods {
59		mod := &l.Mods[i]
60		if mod.Name == name {
61			mod.Enabled = false
62			break
63		}
64	}
65}
66
67func (l *ModList) enable(name string, version *Version) {
68	for i := range l.Mods {
69		mod := &l.Mods[i]
70		if mod.Name == name {
71			mod.Enabled = true
72			mod.Version = version
73			return
74		}
75	}
76	// Mod was not found, so add it
77	mod := ModListMod{Name: name, Enabled: true, Version: version}
78	l.Mods = append(l.Mods, mod)
79}
80
81func (l *ModList) remove(name string) {
82	for i := range l.Mods {
83		mod := &l.Mods[i]
84		if mod.Name != name {
85			continue
86		}
87		// Why does Go make me do this
88		l.Mods = append(l.Mods[:i], l.Mods[i+1:]...)
89	}
90}