package tokenize_test import ( "fmt" "testing" tokenize "git.makaay.nl/mauricem/go-parsekit/tokenize" ) func TestSyntacticSugar(t *testing.T) { var a = tokenize.A AssertHandlers(t, []HandlerT{ {"aaaaaa", a.Char('a').Times(4), true, "aaaa"}, {"ababab", a.Char('a').Or(a.Char('b')).Times(4), true, "abab"}, {"ababab", a.Char('a').Then(a.Char('b')), true, "ab"}, {"bababa", a.Char('a').Then(a.Char('b')), false, ""}, {"cccccc", a.Char('c').Optional(), true, "c"}, {"dddddd", a.Char('c').Optional(), true, ""}, {"a,b,c,d", a.ASCII.SeparatedBy(a.Comma), true, "a,b,c,d"}, {"a, b, c, d", a.ASCII.SeparatedBy(a.Comma.Then(a.Space)), true, "a, b, c, d"}, {"a, b,c,d", a.ASCII.SeparatedBy(a.Comma.Then(a.Space.Optional())), true, "a, b,c,d"}, {"a, b, c, d", a.ASCII.SeparatedBy(a.Space.Optional().Then(a.Comma.Then(a.Space.Optional()))), true, "a, b, c, d"}, {"a,b ,c, d|", a.ASCII.SeparatedBy(a.Space.Optional().Then(a.Comma).Then(a.Space.Optional())), true, "a,b ,c, d"}, }) } func ExampleHandler_Times() { c, a := tokenize.C, tokenize.A phoneNumber := c.Seq(a.Char('0'), a.Digit.Times(9)) fmt.Println(phoneNumber.Match("0201234567")) // Output: // 0201234567 } func ExampleHandler_Then() { c, a := tokenize.C, tokenize.A phoneNumber := a.Char('0').Then(c.Repeated(9, a.Digit)) fmt.Println(phoneNumber.Match("0208888888")) // Output: // 0208888888 } func ExampleHandler_Or() { c, a := tokenize.C, tokenize.A phoneNumber := c.Seq(a.Str("00").Or(a.Plus), a.Str("31"), a.DigitNotZero, c.Repeated(8, a.Digit)) fmt.Println(phoneNumber.Match("+31209876543")) fmt.Println(phoneNumber.Match("0031209876543")) fmt.Println(phoneNumber.Match("0031020991234")) fmt.Println(phoneNumber.Match("0031201234")) // Output: // +31209876543 // 0031209876543 // mismatch at start of file // mismatch at start of file } func ExampleHandler_SeparatedBy() { a, t := tokenize.A, tokenize.T csv := t.Int("number", a.Digits).SeparatedBy(a.Comma) r, _ := csv.Match("123,456,7,8,9") tokens := r.Tokens() for i, token := range tokens { fmt.Printf("[%d] %v\n", i, token) } // Output: // [0] number((int)123) // [1] number((int)456) // [2] number((int)7) // [3] number((int)8) // [4] number((int)9) } func ExampleHandler_Optional() { c, a := tokenize.C, tokenize.A spanish := c.Seq( a.Char('¿').Optional(), c.OneOrMore(a.AnyRune.Except(a.Question)), a.Char('?').Optional()) fmt.Println(spanish.Match("¿Habla español María?")) fmt.Println(spanish.Match("Sí, María habla español.")) // Output: // ¿Habla español María? // Sí, María habla español. } func ExampleHandler_Match() { r, err := tokenize.A.IPv4.Match("001.002.003.004") fmt.Println(r, err) r, err = tokenize.A.IPv4.Match("1.2.3") fmt.Println(r, err) // Output: // 1.2.3.4 // mismatch at start of file }