github.com/raychaser/docker@v1.5.0/builder/parser/utils.go (about) 1 package parser 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 ) 8 9 // dumps the AST defined by `node` as a list of sexps. Returns a string 10 // suitable for printing. 11 func (node *Node) Dump() string { 12 str := "" 13 str += node.Value 14 15 for _, n := range node.Children { 16 str += "(" + n.Dump() + ")\n" 17 } 18 19 if node.Next != nil { 20 for n := node.Next; n != nil; n = n.Next { 21 if len(n.Children) > 0 { 22 str += " " + n.Dump() 23 } else { 24 str += " " + strconv.Quote(n.Value) 25 } 26 } 27 } 28 29 return strings.TrimSpace(str) 30 } 31 32 // performs the dispatch based on the two primal strings, cmd and args. Please 33 // look at the dispatch table in parser.go to see how these dispatchers work. 34 func fullDispatch(cmd, args string) (*Node, map[string]bool, error) { 35 fn := dispatch[cmd] 36 37 // Ignore invalid Dockerfile instructions 38 if fn == nil { 39 fn = parseIgnore 40 } 41 42 sexp, attrs, err := fn(args) 43 if err != nil { 44 return nil, nil, err 45 } 46 47 return sexp, attrs, nil 48 } 49 50 // splitCommand takes a single line of text and parses out the cmd and args, 51 // which are used for dispatching to more exact parsing functions. 52 func splitCommand(line string) (string, string, error) { 53 cmdline := TOKEN_WHITESPACE.Split(line, 2) 54 55 if len(cmdline) != 2 { 56 return "", "", fmt.Errorf("We do not understand this file. Please ensure it is a valid Dockerfile. Parser error at %q", line) 57 } 58 59 cmd := strings.ToLower(cmdline[0]) 60 // the cmd should never have whitespace, but it's possible for the args to 61 // have trailing whitespace. 62 return cmd, strings.TrimSpace(cmdline[1]), nil 63 } 64 65 // covers comments and empty lines. Lines should be trimmed before passing to 66 // this function. 67 func stripComments(line string) string { 68 // string is already trimmed at this point 69 if TOKEN_COMMENT.MatchString(line) { 70 return TOKEN_COMMENT.ReplaceAllString(line, "") 71 } 72 73 return line 74 }