Changeset 200 in code for trunk/config/config.go
- Timestamp:
- Apr 1, 2020, 12:58:14 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/config/config.go
r178 r200 6 6 "io" 7 7 "os" 8 "strings" 9 " unicode"8 9 "github.com/google/shlex" 10 10 ) 11 11 … … 47 47 48 48 func Parse(r io.Reader) (*Server, error) { 49 p := parser{br: bufio.NewReader(r)} 50 directives, err := p.file() 51 if err != nil { 52 return nil, fmt.Errorf("failed to parse config file: %v", err) 49 scanner := bufio.NewScanner(r) 50 51 var directives []directive 52 for scanner.Scan() { 53 words, err := shlex.Split(scanner.Text()) 54 if err != nil { 55 return nil, fmt.Errorf("failed to parse config file: %v", err) 56 } else if len(words) == 0 { 57 continue 58 } 59 60 name, params := words[0], words[1:] 61 directives = append(directives, directive{name, params}) 62 } 63 if err := scanner.Err(); err != nil { 64 return nil, fmt.Errorf("failed to read config file: %v", err) 53 65 } 54 66 … … 100 112 return nil 101 113 } 102 103 type parser struct {104 br *bufio.Reader105 }106 107 func (p *parser) skipSpace() error {108 for {109 r, _, err := p.br.ReadRune()110 if err == io.EOF {111 break112 } else if err != nil {113 return err114 }115 if !unicode.IsSpace(r) || r == '\n' {116 p.br.UnreadRune()117 break118 }119 }120 return nil121 }122 123 func (p *parser) atom() (string, error) {124 var sb strings.Builder125 for {126 r, _, err := p.br.ReadRune()127 if err == io.EOF && sb.Len() > 0 {128 break129 } else if err != nil {130 return "", err131 }132 if unicode.IsSpace(r) {133 p.br.UnreadRune()134 if err := p.skipSpace(); err != nil {135 return "", err136 }137 break138 }139 sb.WriteRune(r)140 }141 return sb.String(), nil142 }143 144 func (p *parser) directive() (*directive, error) {145 name, err := p.atom()146 if err == io.EOF {147 return nil, io.EOF148 } else if err != nil {149 return nil, fmt.Errorf("failed to read directive name: %v", err)150 }151 152 var params []string153 for {154 r, _, err := p.br.ReadRune()155 if err == io.EOF {156 break157 } else if err != nil {158 return nil, err159 }160 if r == '\n' {161 break162 }163 p.br.UnreadRune()164 165 param, err := p.atom()166 if err == io.EOF {167 break168 } else if err != nil {169 return nil, fmt.Errorf("failed to read directive param: %v", err)170 }171 params = append(params, param)172 }173 174 return &directive{name, params}, nil175 }176 177 func (p *parser) file() ([]directive, error) {178 var l []directive179 for {180 d, err := p.directive()181 if err == io.EOF {182 break183 } else if err != nil {184 return nil, err185 }186 l = append(l, *d)187 }188 return l, nil189 }
Note:
See TracChangeset
for help on using the changeset viewer.