Skip to content
Snippets Groups Projects
path_traversal.go 1.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • Manuel Kieweg's avatar
    Manuel Kieweg committed
    package util
    
    import (
    	"fmt"
    	"github.com/openconfig/goyang/pkg/yang"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"github.com/openconfig/ygot/ytypes"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    )
    
    type PathElement struct {
    	Children []*PathElement
    	Name     string
    }
    
    func (p *PathElement)Print()  {
    	printPE(0, p)
    }
    
    func printPE(indent int, pe *PathElement) {
    	for i := 0; i < indent; i++ {
    		fmt.Print("    ")
    	}
    	fmt.Println(pe.Name)
    	if len(pe.Children) > 0 {
    		for _,p := range pe.Children {
    			printPE(indent+1, p)
    		}
    	}
    }
    
    func NewPaths() Paths {
    	return make(map[string]*PathElement)
    }
    
    type Paths map[string]*PathElement
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    func (p Paths) processEntry(e *yang.Entry) *PathElement {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	if e.Dir != nil {
    		elem := &PathElement{
    			Children: make([]*PathElement, len(e.Dir)),
    			Name:     e.Name,
    		}
    		i := 0
    		for _,v := range e.Dir {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			elem.Children[i] =  p.processEntry(v)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			i++
    		}
    		p[e.Name] = elem
    		return elem
    	}
    	leaf := &PathElement{
    		Name:     e.Name,
    	}
    	return leaf
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    }
    
    func (p Paths) ParseSchema(schema *ytypes.Schema, root string) error {
    	tree := schema.SchemaTree
    	for _,v := range tree {
    		if v.Parent != nil {
    			if v.Parent.Name == root {
    				p.processEntry(v)
    			}
    		}
    	}
    	return nil
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    }