-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser_str.go
49 lines (43 loc) · 1.08 KB
/
parser_str.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package joeson
import (
"github.com/grepsuzette/joeson/helpers"
)
// str is a parser that must match a string exactly.
// It does not capture by default.
// ```
// p := newStr("foo").
// p.parse("fool") -> NewNativeString("foo"),
// p.parse("fbar") -> nil.
// ```
type str struct {
*Attr
*rule
Str string
}
func newStr(s string) str {
str := str{newAttr(), newRule(), s}
str.rule.capture = false
str.rule.node = str
return str
}
func (s str) getRule() *rule { return s.rule }
func (s str) prepare() {}
func (s str) handlesChildLabel() bool { return false }
func (s str) String() string {
return Green("'" + helpers.Escape(s.Str) + "'")
}
func (s str) parse(ctx *ParseContext) Ast {
return wrap(func(_ *ParseContext, _ Parser) Ast {
if didMatch, sMatch := ctx.Code.MatchString(s.Str); didMatch {
return NewNativeString(sMatch)
} else {
return nil
}
}, s)(ctx)
}
func (s str) forEachChild(f func(Parser) Parser) Parser {
// @defineChildren
// rules: {type:{key:undefined,value:{type:GNode}}}
s.rules = ForEachChildInRules(s, f)
return s
}