From 134442343cd16d070f3e3eeee8d438a20e83489c Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Wed, 6 May 2015 23:41:23 -0400 Subject: [PATCH] parse durations --- lib/node.go | 31 +++++++++++++++++++ lib/parse.go | 1 + lib/tests/parse/08.in | 11 +++++++ lib/tests/parse/08.out | 67 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 lib/tests/parse/08.in create mode 100644 lib/tests/parse/08.out diff --git a/lib/node.go b/lib/node.go index 0c898bd..52bc2f9 100644 --- a/lib/node.go +++ b/lib/node.go @@ -8,6 +8,7 @@ import ( "sort" "strconv" "strings" + "time" ) type nodeType int @@ -23,6 +24,7 @@ const ( n_object n_variable n_bool + n_duration ) var indent = " " @@ -508,3 +510,32 @@ func (b *boolNode) pretty(w io.Writer, prefix string) error { func (b *boolNode) eval(ctx *context) (interface{}, error) { return bool(*b), nil } + +type durationNode time.Duration + +func (d *durationNode) Type() nodeType { + return n_duration +} + +func (d *durationNode) parse(p *parser) error { + t := p.next() + if t.t != t_duration { + return fmt.Errorf("unexpected %s token while parsing duration", t.t) + } + v, err := time.ParseDuration(t.s) + if err != nil { + return fmt.Errorf("unable to parse duration: %s", err) + } + *d = durationNode(v) + return nil +} + +func (d *durationNode) pretty(w io.Writer, prefix string) error { + fmt.Fprintf(w, "%sdur:\n", prefix) + fmt.Fprintf(w, "%s%s\n", prefix+indent, time.Duration(*d).String()) + return nil +} + +func (d *durationNode) eval(ctx *context) (interface{}, error) { + return *d, nil +} diff --git a/lib/parse.go b/lib/parse.go index 722e5e2..9482edc 100644 --- a/lib/parse.go +++ b/lib/parse.go @@ -17,6 +17,7 @@ var nodes = map[tokenType]func(p *parser) node{ t_object_start: func(p *parser) node { p.next(); return &objectNode{} }, t_variable: func(p *parser) node { return new(variableNode) }, t_bool: func(p *parser) node { return new(boolNode) }, + t_duration: func(p *parser) node { return new(durationNode) }, } var DefaultPath = "./config.moon" diff --git a/lib/tests/parse/08.in b/lib/tests/parse/08.in new file mode 100644 index 0000000..bdf6045 --- /dev/null +++ b/lib/tests/parse/08.in @@ -0,0 +1,11 @@ +dur_1: 30s +dur_2: 300ms +dur_3: -1.5h +dur_4: 2h45m +dur_5: 9ns +dur_6: 18us +dur_7: 45µs +dur_8: 900ms +dur_9: 275s +dur_10: 89m +dur_11: 927h diff --git a/lib/tests/parse/08.out b/lib/tests/parse/08.out new file mode 100644 index 0000000..50738e3 --- /dev/null +++ b/lib/tests/parse/08.out @@ -0,0 +1,67 @@ +root: + assign: + name: + dur_1 + value: + dur: + 30s + assign: + name: + dur_2 + value: + dur: + 300ms + assign: + name: + dur_3 + value: + dur: + -1h30m0s + assign: + name: + dur_4 + value: + dur: + 2h45m0s + assign: + name: + dur_5 + value: + dur: + 9ns + assign: + name: + dur_6 + value: + dur: + 18us + assign: + name: + dur_7 + value: + dur: + 45us + assign: + name: + dur_8 + value: + dur: + 900ms + assign: + name: + dur_9 + value: + dur: + 4m35s + assign: + name: + dur_10 + value: + dur: + 1h29m0s + assign: + name: + dur_11 + value: + dur: + 927h0m0s