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 (
"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:]
}
type teamLines struct {
Home teamline
Away teamline
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
}
type teamline struct {
Runs json.Number
Hits json.Number
Errors json.Number
LeftOnBase json.Number
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
}
func (f *FeedResponse) Patch(instr *instruction) {
err := patch(f, instr.Path, instr.Value)
if err != nil {
}
}
func (p *Play) Patch(patch Patch) {

27
main.go
View File

@ -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)
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))
}