diff --git a/event_types.go b/event_types.go new file mode 100644 index 0000000..7fe4588 --- /dev/null +++ b/event_types.go @@ -0,0 +1,61 @@ +package footballdata + +import ( + "fmt" + "strings" + "time" +) + +// Contains information about a soccerseason update sent to us by the Event API. +type SoccerSeasonUpdate struct { + Timestamp time.Time + Resource string + Id uint64 + URI string + Updates UpdateDescriptor +} + +type FieldUpdateValues struct { + OldValue string + NewValue string +} + +func (v FieldUpdateValues) String() string { + return fmt.Sprintf("%s -> %s", v.OldValue, v.NewValue) +} + +type FieldUpdate struct { + Name string + Values *FieldUpdateValues +} + +func (v FieldUpdate) String() string { + r := []string{v.Name} + if v.Values != nil { + r = append(r, v.Values.String()) + } + return strings.Join(r, "|") +} + +type UpdateDescriptor string + +func (d UpdateDescriptor) Fields() (retval []FieldUpdate) { + // (FIELD_NAME|OLD_VALUE -> NEW_VALUE)(;($1))? + retval = []FieldUpdate{} + fieldStrs := strings.Split(string(d), ";") + for _, fieldStr := range fieldStrs { + field := FieldUpdate{} + fieldStrSplit := strings.SplitN(fieldStr, "|", 2) + field.Name = fieldStrSplit[0] + if len(fieldStrSplit) > 1 { + // OLD_VALUE -> NEW_VALUE + valueSplit := strings.Split(fieldStrSplit[1], " -> ") + field.Values = &FieldUpdateValues{ + OldValue: valueSplit[0], + NewValue: valueSplit[1], + } + } + retval = append(retval, field) + } + return +} diff --git a/event_types_test.go b/event_types_test.go new file mode 100644 index 0000000..f356a61 --- /dev/null +++ b/event_types_test.go @@ -0,0 +1,58 @@ +package footballdata + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_UpdateDescriptor_Fields(t *testing.T) { + testValue := UpdateDescriptor("status|IN_PLAY -> FINISHED") + fields := testValue.Fields() + + assert.Len(t, fields, 1) + + assert.Equal(t, "status", fields[0].Name) + assert.NotNil(t, fields[0].Values) + assert.Equal(t, "IN_PLAY", fields[0].Values.OldValue) + assert.Equal(t, "FINISHED", fields[0].Values.NewValue) +} + +func Test_UpdateDescriptor_Fields_Multiple(t *testing.T) { + testValue := UpdateDescriptor("status|IN_PLAY -> FINISHED;score|1:0 -> 1:1") + fields := testValue.Fields() + + assert.Len(t, fields, 2) + + assert.Equal(t, "status", fields[0].Name) + assert.NotNil(t, fields[0].Values) + assert.Equal(t, "IN_PLAY", fields[0].Values.OldValue) + assert.Equal(t, "FINISHED", fields[0].Values.NewValue) + + assert.Equal(t, "score", fields[1].Name) + assert.NotNil(t, fields[1].Values) + assert.Equal(t, "1:0", fields[1].Values.OldValue) + assert.Equal(t, "1:1", fields[1].Values.NewValue) +} + +func Test_UpdateDescriptor_Fields_NameOnly(t *testing.T) { + testValue := UpdateDescriptor("status") + fields := testValue.Fields() + + assert.Len(t, fields, 1) + assert.Equal(t, "status", fields[0].Name) + assert.Nil(t, fields[0].Values) +} + +func Test_UpdateDescriptor_Fields_NameOnly_Multiple(t *testing.T) { + testValue := UpdateDescriptor("status;leagueTable") + fields := testValue.Fields() + + assert.Len(t, fields, 2) + + assert.Equal(t, "status", fields[0].Name) + assert.Nil(t, fields[0].Values) + + assert.Equal(t, "leagueTable", fields[1].Name) + assert.Nil(t, fields[1].Values) +}