...

Source file src/github.com/noirbizarre/gonja/nodes/walk.go

Documentation: github.com/noirbizarre/gonja/nodes

     1  package nodes
     2  
     3  import (
     4  	"github.com/pkg/errors"
     5  )
     6  
     7  type Visitor interface {
     8  	Visit(node Node) (Visitor, error)
     9  }
    10  
    11  // type Visitor interface {
    12  // 	Template(node *Template) error
    13  // 	Comment(node *Template) error
    14  // 	Data(node *Data) error
    15  // 	Output(node *Output) error
    16  // 	Statement(node *Statement) error
    17  // }
    18  
    19  func Walk(v Visitor, node Node) error {
    20  	v, err := v.Visit(node)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	if v == nil {
    25  		return nil
    26  	}
    27  
    28  	switch n := node.(type) {
    29  	case *Template:
    30  		for _, node := range n.Nodes {
    31  			if err := Walk(v, node); err != nil {
    32  				return err
    33  			}
    34  		}
    35  	case *Wrapper:
    36  		for _, node := range n.Nodes {
    37  			if err := Walk(v, node); err != nil {
    38  				return err
    39  			}
    40  		}
    41  	// case *Data:
    42  	// 	return visitor.Data(t)
    43  	// case *Output:
    44  	// 	return visitor.Output(t)
    45  	default:
    46  		return errors.Errorf("Unkown type %T", n)
    47  	}
    48  	return nil
    49  }
    50  
    51  type Inspector func(Node) bool
    52  
    53  func (f Inspector) Visit(node Node) (Visitor, error) {
    54  	if f(node) {
    55  		return f, nil
    56  	}
    57  	return nil, nil
    58  }
    59  
    60  // Inspect traverses an AST in depth-first order: It starts by calling
    61  // f(node); node must not be nil. If f returns true, Inspect invokes f
    62  // recursively for each of the non-nil children of node, followed by a
    63  // call of f(nil).
    64  //
    65  func Inspect(node Node, f func(Node) bool) {
    66  	Walk(Inspector(f), node)
    67  }
    68  
    69  // type NoOpVisitor struct {}
    70  
    71  // func (v *NoOpVisitor) Template(node *Template) error {
    72  // 	return nil
    73  // }
    74  // func (v *NoOpVisitor) Comment(node *Template) error {
    75  // 	return nil
    76  // }
    77  // func (v *NoOpVisitor) Data(node *Data) error {
    78  // 	return nil
    79  // }
    80  // func (v *NoOpVisitor) Output(node *Output) error {
    81  // 	return nil
    82  // }
    83  // func (v *NoOpVisitor) Statement(node *Statement) error {
    84  // 	return nil
    85  // }
    86  

View as plain text