()
| 222 | } |
| 223 | |
| 224 | func (parser *Parser) parseInclude() error { |
| 225 | if parser.curTok.ID != token.STRING { |
| 226 | msg := fmt.Sprintf("expected STRING instead found '%s'", parser.curTok.ID) |
| 227 | return parser.syntaxError(msg) |
| 228 | } |
| 229 | pattern := parser.curTok.Literal |
| 230 | |
| 231 | parser.readToken() |
| 232 | if isSemicolonOrNewline(parser.curTok.ID) == false { |
| 233 | msg := fmt.Sprintf("expected ';' or '\n' instead found '%s'", parser.curTok.Literal) |
| 234 | return parser.syntaxError(msg) |
| 235 | } |
| 236 | |
| 237 | filenames, err := filepath.Glob(pattern) |
| 238 | if err != nil { |
| 239 | return err |
| 240 | } |
| 241 | oldScanner := parser.scanner |
| 242 | for _, filename := range filenames { |
| 243 | // We have already visited this file, don't include again |
| 244 | // DEV: This can cause recursive includes if this isn't here :o |
| 245 | if parser.hasParsed(filename) { |
| 246 | continue |
| 247 | } |
| 248 | reader, err := os.Open(filename) |
| 249 | defer reader.Close() |
| 250 | if err != nil { |
| 251 | return err |
| 252 | } |
| 253 | parser.curSection.AddInclude(filename) |
| 254 | parser.scanner = NewScanner(reader) |
| 255 | parser.parse() |
| 256 | // Make sure to add the filename to the internal list to ensure we don't |
| 257 | // accidentally recursively include config files |
| 258 | parser.addFile(filename) |
| 259 | } |
| 260 | parser.scanner = oldScanner |
| 261 | parser.readToken() |
| 262 | return nil |
| 263 | } |
| 264 | |
| 265 | func (parser *Parser) parseSection(name string) error { |
| 266 | section := parser.curSection.AddSection(name) |
no test coverage detected