-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparse.go
109 lines (91 loc) · 2.12 KB
/
parse.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
package main
import (
"encoding/json"
"errors"
"log"
"os"
)
type PhraseSet [][2]any // string | PhraseSet
func loadFileInto[T any](path string) (T, error) {
f, err := os.ReadFile(path)
if err != nil {
return *new(T), err
}
phs := new(T)
err = json.Unmarshal(f, &phs)
return *phs, err
}
func loadPhraseSet(path string) (PhraseSet, error) {
return loadFileInto[PhraseSet](path)
}
func parseWheel(ps PhraseSet) ChatWheelI {
wc := new(WheelController)
wc.Current = makeWheelFrame('0', "")
wc.Start = wc.Current
parseWheelFrameInto(wc, ps)
wc.Current = nil
return wc
}
var ErrParsePhraseSet = errors.New("Couldn't parse the file")
func parseWheelFrameInto(wc *WheelController, ps PhraseSet) {
if len(ps) == 0 {
log.Fatal("Encountered empty phrase set")
}
for _, p := range ps {
prompt := p[0].(string)
nextI := len(wc.Current.Items)
key := makeKey(nextI)
phrase, isString := p[1].(string)
if isString {
wco := makeWheelChatOption(key, prompt, phrase)
wc.addItem(nextI, wco)
continue
}
anyArr, isArr := p[1].([]any)
if !isArr {
log.Fatal(ErrParsePhraseSet)
}
pset := parseAnyArrIntoPhraseSet(anyArr)
wf := makeWheelFrame(key, prompt)
wc.addItem(nextI, wf)
oldCur := wc.Current
wc.Current = wf
parseWheelFrameInto(wc, pset)
wc.Current = oldCur
}
}
func parseAnyArrIntoPhraseSet(anyArr []any) PhraseSet {
pset := make(PhraseSet, 0)
for _, v := range anyArr {
slice, ok := v.([]any)
if !ok {
log.Fatal(ErrParsePhraseSet)
}
pair := [2]any{}
for i := range pair {
pair[i] = slice[i]
}
pset = append(pset, pair)
}
return pset
}
func reassignAndSwapKeys(it WheelItemI, toKey rune) (WheelItemI, rune) {
var oldKey rune
var wi WheelItemI
switch it.(type) {
case *WheelFrame:
oldF := it.(*WheelFrame)
oldKey = oldF.Key
oldPrompt := oldF.Prompt
wi = makeWheelFrame(toKey, oldPrompt)
case WheelChatOption:
oldF := it.(WheelChatOption)
oldKey = oldF.Key
oldPrompt := oldF.Prompt
oldContent := oldF.Text
wi = makeWheelChatOption(toKey, oldPrompt, oldContent)
default:
log.Fatal("Encountered wrong type while trying to parse data")
}
return wi, oldKey
}