<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/main/pathfilterast.go
diff options
context:
space:
mode:
Diffstat (limited to 'main/pathfilterast.go')
-rw-r--r--main/pathfilterast.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/main/pathfilterast.go b/main/pathfilterast.go
new file mode 100644
index 0000000..c2ddc7f
--- /dev/null
+++ b/main/pathfilterast.go
@@ -0,0 +1,56 @@
+package main
+
+type StringSegmentPathFilterAST struct {
+ index string
+}
+func (ast StringSegmentPathFilterAST) compileWith(next PathFilterState) PathFilterState {
+ return StringSegmentPathFilter {
+ index: ast.index,
+ next: next,
+ }
+}
+
+type IntegerSegmentPathFilterAST struct {
+ index int
+}
+func (ast IntegerSegmentPathFilterAST) compileWith(next PathFilterState) PathFilterState {
+ return IntegerSegmentPathFilter {
+ index: ast.index,
+ next: next,
+ }
+}
+
+type RepeatPathFilterAST struct {
+ content PathFilterAST
+}
+func (ast RepeatPathFilterAST) compileWith(next PathFilterState) PathFilterState {
+ nextGroup := &GroupPathFilter{}
+ repeatStart := ast.content.compileWith(nextGroup)
+ nextGroup.filters = []PathFilterState{next, repeatStart}
+ return nextGroup
+}
+
+type SequencePathFilterAST struct {
+ sequence []PathFilterAST
+}
+func (ast SequencePathFilterAST) compileWith(next PathFilterState) PathFilterState {
+ for i := len(ast.sequence) - 1; i >= 0; i -= 1 {
+ next = ast.sequence[i].compileWith(next)
+ }
+ return next
+}
+
+type AnySegmentPathFilterAST struct {}
+func (ast AnySegmentPathFilterAST) compileWith(next PathFilterState) PathFilterState {
+ return AnySegmentPathFilter{next: next}
+}
+
+type PathFilterAST interface {
+ compileWith(PathFilterState) PathFilterState
+}
+
+func compilePathFilterAST(ast PathFilterAST) PathFilter {
+ return PathFilter{
+ initial: ast.compileWith(NonePathFilter{}),
+ }
+}