54 lines
961 B
Go
54 lines
961 B
Go
|
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
|
||
|
}
|