12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package main
- import (
- "bufio"
- "bytes"
- "fmt"
- "github.com/kpmy/tier"
- "io"
- "log"
- )
- const (
- Dash tier.SymCode = iota + tier.UserIota
- Z
- Colon
- Plus
- Minus = Dash
- )
- type Parser struct {
- tier.Marker
- r tier.Runner
- }
- func (p *Parser) FutureMark() tier.Marker { panic(126) }
- func (p *Parser) Mark(msg ...interface{}) {
- panic(fmt.Sprint(msg...))
- }
- func (p *Parser) Log(msg ...interface{}) {
- log.Println(msg...)
- }
- func (p *Parser) ConnectTo(rd io.Reader) {
- sc := tier.NewScanner(bufio.NewReader(rd), opts)
- p.r = tier.NewRunner(sc, p)
- //tier.Debug(p.r)
- }
- var opts tier.Opts
- func parse(ts string) {
- p := &Parser{}
- p.ConnectTo(bytes.NewBufferString(ts))
- log.Println(p.r.Assert(tier.Number, "number expected").Value)
- p.r.Assert(Dash, "dash expected")
- log.Println(p.r.Assert(tier.Number, "number expected").Value)
- p.r.Assert(Dash, "dash expected")
- log.Println(p.r.Assert(tier.Number, "number expected").Value)
- offset := ""
- getOffset := func() (offset string) {
- offset = p.r.Assert(tier.Number, "number expected").Value
- p.r.Assert(Colon, "colon expected")
- offset = offset + ":" + p.r.Assert(tier.Number, "number expected").Value
- return
- }
- if p.r.Await(Minus) {
- p.r.Next()
- offset = "-" + getOffset()
- } else if p.r.Is(Plus) {
- p.r.Next()
- offset = "+" + getOffset()
- } else if p.r.Is(Z) {
- offset = "Z"
- }
- if offset != "" {
- log.Println(offset)
- }
- log.Println()
- }
- func init() {
- log.SetFlags(0)
- opts = tier.DefaultOpts
- opts.CombinedMap["-"] = Dash
- opts.CombinedMap["+"] = Plus
- opts.CombinedMap[":"] = Colon
- opts.IdentMap["Z"] = Z
- }
- //xml datetime format
- func main() {
- parse("2015-11-05")
- parse("2015-11-05Z")
- parse("2015-11-05+04:00")
- parse("2015-11-05-01:00")
- }
|