test patching feed using diffpatch

This commit is contained in:
filifa 2024-07-03 22:27:36 -05:00
parent b7aa862cf5
commit 9ebb5bf610
2 changed files with 79 additions and 54 deletions

View File

@ -2,47 +2,16 @@ package statsapi
import ( import (
"encoding/json" "encoding/json"
"errors"
"strconv"
"strings"
) )
type FeedParams struct { type FeedParams struct {
GamePk string GamePk string
} }
type FeedResponse struct { type FeedResponse map[string]any
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 Play struct { type Play struct {
Result result Result result
@ -66,20 +35,59 @@ type about struct {
CaptivatingIndex json.Number CaptivatingIndex json.Number
} }
type linescore struct { func patch(obj any, path string, value any) error {
Teams teamLines 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 { func (f *FeedResponse) Patch(instr *instruction) {
Home teamline err := patch(f, instr.Path, instr.Value)
Away teamline if err != nil {
} }
type teamline struct {
Runs json.Number
Hits json.Number
Errors json.Number
LeftOnBase json.Number
} }
func (p *Play) Patch(patch Patch) { func (p *Play) Patch(patch Patch) {

31
main.go
View File

@ -59,17 +59,34 @@ func main() {
log.Fatal(err) log.Fatal(err)
} }
ts := feed.MetaData.TimeStamp j, err := json.Marshal(feed)
game, err := InitGame(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 { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
for { patches, err := statsapi.DiffPatch(gamePk, ts, p.UpdateId)
var p statsapi.Push if err != nil {
err := ws.ReadJSON(&p) log.Fatal(err)
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))
} }