-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
115 lines (102 loc) · 2.69 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package common
import (
"os"
"log"
"encoding/json"
"path/filepath"
)
type ConfigJoystickData struct {
A string `json:"a,omitempty"`
B string `json:"b,omitempty"`
Select string `json:"select,omitempty"`
Start string `json:"start,omitempty"`
Up string `json:"up,omitempty"`
Down string `json:"down,omitempty"`
Left string `json:"left,omitempty"`
Right string `json:"right,omitempty"`
Guid string `json:"guid,omitempty"`
Name string `json:"name,omitempty"`
}
type ConfigKeys struct {
Turbo string
Pause string
HardReset string
PPUDebug string
SlowDown string
SpeedUp string
Normal string
StepFrame string
Record string
SaveState string
LoadState string
Console string
ButtonA string
ButtonB string
ButtonTurboA string
ButtonTurboB string
ButtonSelect string
ButtonStart string
ButtonUp string
ButtonDown string
ButtonLeft string
ButtonRight string
}
type ConfigData struct {
Version int `json:"version,omitempty"`
Player1Joystick ConfigJoystickData `json:"player1-joystick,omitempty"`
Player1Keys ConfigKeys `json:"player1-keys,omitempty"`
}
/* make the directory where the config file lives, which is ~/.config/jon-nes on linux */
func GetOrCreateConfigDir() (string, error) {
configDir, err := os.UserConfigDir()
if err != nil {
return "", err
}
configPath := filepath.Join(configDir, "jon-nes")
err = os.MkdirAll(configPath, 0755)
if err != nil {
return "", err
}
return configPath, nil
}
func DefaultConfigData() ConfigData {
return ConfigData{
Version: 1,
}
}
func LoadConfigData() (ConfigData, error) {
configPath, err := GetOrCreateConfigDir()
if err != nil {
return DefaultConfigData(), err
}
config := filepath.Join(configPath, "config.json")
file, err := os.Open(config)
if err != nil {
return DefaultConfigData(), err
}
defer file.Close()
var data ConfigData
decoder := json.NewDecoder(file)
err = decoder.Decode(&data)
if err != nil {
log.Printf("Could not load config data: %v", err)
return DefaultConfigData(), err
}
return data, nil
}
/* create the config.json file in the config dir and return the opened file, or an error */
func SaveConfigData(data ConfigData) error {
configPath, err := GetOrCreateConfigDir()
if err != nil {
return err
}
config := filepath.Join(configPath, "config.json")
file, err := os.Create(config)
if err != nil {
return err
}
defer file.Close()
encoder := json.NewEncoder(file)
encoder.SetIndent("", " ")
return encoder.Encode(data)
}