github.com/getgauge/gauge@v1.6.9/parser/processor.go (about) 1 /*---------------------------------------------------------------- 2 * Copyright (c) ThoughtWorks, Inc. 3 * Licensed under the Apache License, Version 2.0 4 * See LICENSE in the project root for license information. 5 *----------------------------------------------------------------*/ 6 7 package parser 8 9 import ( 10 "bytes" 11 "fmt" 12 "strings" 13 14 "github.com/getgauge/gauge/gauge" 15 ) 16 17 func processSpec(parser *SpecParser, token *Token) ([]error, bool) { 18 return []error{}, false 19 } 20 21 func processTearDown(parser *SpecParser, token *Token) ([]error, bool) { 22 if len(token.Value) < 3 { 23 return []error{fmt.Errorf("Teardown should have at least three underscore characters")}, true 24 } 25 return []error{}, false 26 } 27 28 func processDataTable(parser *SpecParser, token *Token) ([]error, bool) { 29 if len(strings.TrimSpace(strings.Replace(token.Value, "table:", "", 1))) == 0 { 30 return []error{fmt.Errorf("Table location not specified")}, true 31 } 32 return []error{}, false 33 } 34 35 func processScenario(parser *SpecParser, token *Token) ([]error, bool) { 36 if len(strings.TrimSpace(token.Value)) < 1 { 37 return []error{fmt.Errorf("Scenario heading should have at least one character")}, true 38 } 39 parser.clearState() 40 return []error{}, false 41 } 42 43 func processComment(parser *SpecParser, token *Token) ([]error, bool) { 44 parser.clearState() 45 addStates(&parser.currentState, commentScope) 46 return []error{}, false 47 } 48 49 func processTag(parser *SpecParser, token *Token) ([]error, bool) { 50 if isInState(parser.currentState, tagsScope) { 51 retainStates(&parser.currentState, tagsScope) 52 } else { 53 parser.clearState() 54 } 55 tokens := splitAndTrimTags(token.Value) 56 57 for _, tagValue := range tokens { 58 if len(tagValue) > 0 { 59 token.Args = append(token.Args, tagValue) 60 } 61 } 62 return []error{}, false 63 } 64 65 func processTable(parser *SpecParser, token *Token) ([]error, bool) { 66 var buffer bytes.Buffer 67 shouldEscape := false 68 var errs []error 69 for i, element := range token.Value { 70 if i == 0 { 71 continue 72 } 73 if shouldEscape { 74 _, err := buffer.WriteRune(element) 75 if err != nil { 76 errs = append(errs, err) 77 } 78 shouldEscape = false 79 continue 80 } 81 if element == '\\' { 82 shouldEscape = true 83 continue 84 } else if element == '|' { 85 trimmedValue := strings.TrimSpace(buffer.String()) 86 87 if token.Kind == gauge.TableHeader { 88 if len(trimmedValue) == 0 { 89 errs = append(errs, fmt.Errorf("Table header should not be blank")) 90 } else if arrayContains(token.Args, trimmedValue) { 91 errs = append(errs, fmt.Errorf("Table header cannot have repeated column values")) 92 } 93 } 94 token.Args = append(token.Args, trimmedValue) 95 buffer.Reset() 96 } else { 97 _, err := buffer.WriteRune(element) 98 if err != nil { 99 errs = append(errs, err) 100 } 101 } 102 } 103 104 if !isInState(parser.currentState, tableScope) { 105 addStates(&parser.currentState, tableScope) 106 } else { 107 addStates(&parser.currentState, tableDataScope) 108 } 109 110 return errs, false 111 } 112 113 func splitAndTrimTags(tag string) []string { 114 listOfTags := strings.Split(tag, ",") 115 for i, aTag := range listOfTags { 116 listOfTags[i] = strings.TrimSpace(aTag) 117 } 118 return listOfTags 119 }