diff --git a/replication/changes.go b/replication/changes.go index 32c3131..f7cefed 100644 --- a/replication/changes.go +++ b/replication/changes.go @@ -17,15 +17,33 @@ func NewChangesetDownloader(dest, url string, seq int, interval time.Duration) * } type changesetState struct { - Time time.Time `yaml:"last_run"` - Sequence int `yaml:"sequence"` + Time yamlStateTime `yaml:"last_run"` + Sequence int `yaml:"sequence"` } -func parseYamlState(filename string) (changesetState, error) { +type yamlStateTime struct { + time.Time +} + +func (y *yamlStateTime) UnmarshalYAML(unmarshal func(interface{}) error) error { + var ts string + if err := unmarshal(&ts); err != nil { + return err + } + t, err := time.Parse("2006-01-02 15:04:05.999999999 -07:00", ts) + y.Time = t + return err +} + +func parseYamlStateFile(filename string) (changesetState, error) { b, err := ioutil.ReadFile(filename) if err != nil { return changesetState{}, err } + return parseYamlState(b) +} + +func parseYamlState(b []byte) (changesetState, error) { state := changesetState{} if err := yaml.Unmarshal(b, &state); err != nil { return changesetState{}, err @@ -34,9 +52,9 @@ func parseYamlState(filename string) (changesetState, error) { } func parseYamlTime(filename string) (time.Time, error) { - state, err := parseYamlState(filename) + state, err := parseYamlStateFile(filename) if err != nil { return time.Time{}, err } - return state.Time, nil + return state.Time.Time, nil } diff --git a/replication/changes_test.go b/replication/changes_test.go new file mode 100644 index 0000000..53b8dd2 --- /dev/null +++ b/replication/changes_test.go @@ -0,0 +1,26 @@ +package replication + +import ( + "time" + + "testing" +) + +func TestParseYamlState(t *testing.T) { + state, err := parseYamlState([]byte(`--- +last_run: 2016-12-07 19:16:01.500000000 +00:00 +sequence: 2139110 +`)) + if err != nil { + t.Fatal(err) + } + if state.Sequence != 2139110 { + t.Error("unexpected sequence", state) + } + + expected := time.Date(2016, 12, 07, 19, 16, 01, 500000000, time.UTC) + if !state.Time.Time.Equal(expected) { + t.Error("unexpected time", state) + } + +}