diff --git a/internal/statsapi/feed.go b/internal/statsapi/feed.go index 5d95e1d..4cda660 100644 --- a/internal/statsapi/feed.go +++ b/internal/statsapi/feed.go @@ -2,47 +2,16 @@ package statsapi import ( "encoding/json" + "errors" + "strconv" + "strings" ) type FeedParams struct { GamePk string } -type FeedResponse struct { - GamePk string - MetaData metadata - GameData gamedata - LiveData livedata -} - -type metadata struct { - TimeStamp string -} - -type gamedata struct { - Teams teams -} - -type teams struct { - Away team - Home team -} - -type team struct { - LocationName string - TeamName string -} - -type livedata struct { - Plays plays - Linescore linescore -} - -type plays struct { - AllPlays []Play - CurrentPlay Play - ScoringPlays []json.Number -} +type FeedResponse map[string]any type Play struct { Result result @@ -66,20 +35,59 @@ type about struct { CaptivatingIndex json.Number } -type linescore struct { - Teams teamLines +func patch(obj any, path string, value any) error { + if string(path[0]) == "/" { + path = path[1:] + } + + var err error + first, rest, found := strings.Cut(path, "/") + if !found { + switch v := obj.(type) { + case *FeedResponse: + (*v)[first] = value + case map[string]any: + v[first] = value + case []any: + idx, err := strconv.Atoi(first) + if err != nil { + break + } + + if idx < len(v) { + v[idx] = value + } else { + v = append(v, value) + } + default: + err = errors.New("couldn't determine type") + } + + return err + } + + switch v := obj.(type) { + case *FeedResponse: + err = patch((*v)[first], rest, value) + case map[string]any: + err = patch(v[first], rest, value) + case []any: + idx, err := strconv.Atoi(first) + if err != nil { + break + } + err = patch(v[idx], rest, value) + default: + err = errors.New("couldn't determine type") + } + + return err } -type teamLines struct { - Home teamline - Away teamline -} - -type teamline struct { - Runs json.Number - Hits json.Number - Errors json.Number - LeftOnBase json.Number +func (f *FeedResponse) Patch(instr *instruction) { + err := patch(f, instr.Path, instr.Value) + if err != nil { + } } func (p *Play) Patch(patch Patch) { diff --git a/main.go b/main.go index 6ca059d..939a261 100644 --- a/main.go +++ b/main.go @@ -59,17 +59,34 @@ func main() { log.Fatal(err) } - ts := feed.MetaData.TimeStamp - game, err := InitGame(feed) + j, err := json.Marshal(feed) + if err != nil { + log.Fatal(err) + } + fmt.Println(string(j)) + + ts := feed["metaData"].(map[string]any)["timeStamp"].(string) + + var p statsapi.Push + err = ws.ReadJSON(&p) if err != nil { log.Fatal(err) } - for { - var p statsapi.Push - err := ws.ReadJSON(&p) - if err != nil { - log.Fatal(err) + patches, err := statsapi.DiffPatch(gamePk, ts, p.UpdateId) + if err != nil { + log.Fatal(err) + } + + for _, patch := range patches { + for _, instr := range patch.Diff { + feed.Patch(&instr) } } + + j, err = json.Marshal(feed) + if err != nil { + log.Fatal(err) + } + fmt.Println(string(j)) }