Implement types for Event API.

feature/event-api
Icedream 2016-06-14 14:57:13 +02:00
parent df54a3b11f
commit e51c8e5d1c
2 changed files with 119 additions and 0 deletions

61
event_types.go Normal file
View File

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

58
event_types_test.go Normal file
View File

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