diff options
author | Charlie Stanton <charlie@shtanton.xyz> | 2023-07-19 12:01:38 +0100 |
---|---|---|
committer | Charlie Stanton <charlie@shtanton.xyz> | 2023-07-19 12:01:38 +0100 |
commit | 7d53110f2773ba758dea2f5c00483d879d378870 (patch) | |
tree | 018e4c2f04557b0e2fb0024ba389e2e5a4d7fbda /json_array/read.go | |
parent | 8cf10efe3b5a1bcc70bc6e5590ee63fd5eb00c5b (diff) | |
download | stred-go-7d53110f2773ba758dea2f5c00483d879d378870.tar |
Removes redundant json readers and writers
Diffstat (limited to 'json_array/read.go')
-rw-r--r-- | json_array/read.go | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/json_array/read.go b/json_array/read.go deleted file mode 100644 index 786bc2c..0000000 --- a/json_array/read.go +++ /dev/null @@ -1,118 +0,0 @@ -package json_array - -import ( - "main/walk" - "encoding/json" - "errors" - "bufio" -) - -type state int -const ( - stateStart state = iota - stateValueStart - stateEnd - stateDead -) - -func atomiseValue(value interface{}) []walk.AtomOLD { - switch v := value.(type) { - case nil: - return []walk.AtomOLD{walk.NewAtomNull()} - case bool: - return []walk.AtomOLD{walk.NewAtomBool(v)} - case float64: - return []walk.AtomOLD{walk.NewAtomNumber(v)} - case string: - atoms := []walk.AtomOLD{walk.NewAtomStringTerminal()} - for _, r := range v { - atoms = append(atoms, walk.NewAtomStringRune(r)) - } - atoms = append(atoms, walk.NewAtomStringTerminal()) - return atoms - case []interface{}: - atoms := []walk.AtomOLD{walk.NewAtomTerminal(walk.ArrayBegin)} - for _, element := range v { - atoms = append(atoms, atomiseValue(element)...) - } - atoms = append(atoms, walk.NewAtomTerminal(walk.ArrayEnd)) - return atoms - case map[string]interface{}: - atoms := []walk.AtomOLD{walk.NewAtomTerminal(walk.MapBegin)} - for key, element := range v { - atoms = append(atoms, atomiseValue(key)...) - atoms = append(atoms, atomiseValue(element)...) - } - atoms = append(atoms, walk.NewAtomTerminal(walk.MapEnd)) - return atoms - default: - panic("Invalid JSON value type") - } -} - -func NewJSONArrayReader(reader *bufio.Reader) *JSONArrayReader { - return &JSONArrayReader { - decoder: json.NewDecoder(reader), - state: stateStart, - index: 0, - } -} - -type JSONArrayReader struct { - decoder *json.Decoder - state state - index int -} - -func (in *JSONArrayReader) Read() (walk.WalkItem, error) { - restart: - switch in.state { - case stateStart: - arrayStart, err := in.decoder.Token() - if err != nil { - panic("Error reading start of JSON array") - } - delim, isDelim := arrayStart.(json.Delim) - if !isDelim || delim != '[' { - panic("JSON input is not an array!") - } - in.state = stateValueStart - goto restart - case stateValueStart: - if !in.decoder.More() { - in.state = stateEnd - goto restart - } - var m interface{} - err := in.decoder.Decode(&m) - if err != nil { - panic("Error decoding array value") - } - in.index += 1 - return walk.WalkItem { - Path: []interface{}{float64(in.index - 1)}, - Value: []interface{}{m}, - }, nil - case stateEnd: - arrayEnd, err := in.decoder.Token() - if err != nil { - panic("Error reading end of JSON array") - } - delim, isDelim := arrayEnd.(json.Delim) - if !isDelim || delim != ']' { - panic("JSON array wasn't ended") - } - in.state = stateDead - return walk.WalkItem{}, errors.New("eof") - case stateDead: - return walk.WalkItem{}, errors.New("eof") - default: - panic("Unreachable!!!") - } -} - -func (in *JSONArrayReader) AssertDone() { - if in.state != stateDead || in.decoder.More() { - panic("More JSON after array value") - } -} |