package main import ( "errors" "io" "text/scanner" ) type Submodule struct { Name string Path string } var SyntaxError error = errors.New("Syntax error") func (sub *Submodule) parseSubmoduleName(s *scanner.Scanner) error { s.Scan() if s.TokenText() != "submodule" { return SyntaxError } s.Scan() sub.Name = s.TokenText() l := len(sub.Name) if sub.Name[0] != '"' || sub.Name[l-1] != '"' || s.ErrorCount > 0 { return SyntaxError } sub.Name = sub.Name[1 : len(sub.Name)-1] s.Scan() if s.TokenText() != "]" { return SyntaxError } return nil } func ParseSubmodulesFile(reader io.Reader) ([]Submodule, error) { ret := make([]Submodule, 0, 100) s := new(scanner.Scanner) s.Init(reader) sub := &Submodule{} for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { t := s.TokenText() if t == "[" { if err := sub.parseSubmoduleName(s); err != nil { return nil, err } } ret = append(ret, *sub) } return ret, nil }