This commit is contained in:
Adam Majer 2025-02-03 18:15:01 +01:00
parent 12a641c86f
commit c7723fce2d

View File

@ -1,9 +1,12 @@
package main package main
import ( import (
"bytes"
"errors" "errors"
"fmt"
"io" "io"
"text/scanner" "strings"
"unicode"
) )
type Submodule struct { type Submodule struct {
@ -13,40 +16,113 @@ type Submodule struct {
var SyntaxError error = errors.New("Syntax error") var SyntaxError error = errors.New("Syntax error")
func (sub *Submodule) parseSubmoduleName(s *scanner.Scanner) error { func (sub *Submodule) parseSubmoduleName(line string) error {
s.Scan() line = strings.TrimSpace(line)
if s.TokenText() != "submodule" { if line[0:10] != "submodule " {
return SyntaxError return SyntaxError
} }
s.Scan()
sub.Name = s.TokenText() r := strings.NewReader(line[10:])
l := len(sub.Name)
if sub.Name[0] != '"' || sub.Name[l-1] != '"' || s.ErrorCount > 0 { ch, _, err := r.ReadRune()
for ; ; ch, _, err = r.ReadRune() {
if err != nil {
return fmt.Errorf("%c %d", ch, 32)
}
if !unicode.IsSpace(ch) {
break
}
}
if ch != '"' {
return fmt.Errorf("%c %d", ch, 36)
// return SyntaxError
}
var b strings.Builder
for ch, _, err = r.ReadRune(); ch != '"'; ch, _, err = r.ReadRune() {
if err != nil {
return fmt.Errorf("%c %d", ch, 32)
}
b.WriteRune(ch)
}
if ch != '"' {
return fmt.Errorf("%c %d", ch, 45)
// return SyntaxError
}
ch, _, err = r.ReadRune()
if ch != ']' || err != nil {
return fmt.Errorf("%c %d, %w", ch, 50, err)
// return SyntaxError
}
sub.Name = b.String()
for ch, _, err = r.ReadRune(); ; ch, _, _ = r.ReadRune() {
if err == io.EOF {
return nil
}
if !unicode.IsSpace(ch) {
return SyntaxError
}
}
}
func (s *Submodule) parseKeyValue(line string) error {
eqLoc := strings.Index(line, "=")
if eqLoc < 0 || eqLoc == len(line)-1 {
return SyntaxError return SyntaxError
} }
sub.Name = sub.Name[1 : len(sub.Name)-1]
s.Scan() key := strings.ToLower(strings.TrimSpace(line[0:eqLoc]))
if s.TokenText() != "]" { val := strings.TrimSpace(line[eqLoc+1:])
if len(val) == 0 {
return SyntaxError return SyntaxError
} }
switch key {
case "path":
s.Path = val
}
return nil return nil
} }
func ParseSubmodulesFile(reader io.Reader) ([]Submodule, error) { func ParseSubmodulesFile(reader io.Reader) ([]Submodule, error) {
ret := make([]Submodule, 0, 100) data, err := io.ReadAll(reader)
if err != nil {
return nil, err
}
s := new(scanner.Scanner) var sub *Submodule
s.Init(reader) ret := []Submodule{}
sub := &Submodule{} lines := bytes.Split(data, []byte("\n"))
for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() { for _, l := range lines {
t := s.TokenText() line := string(bytes.TrimSpace(l))
if len(line) == 0 {
if t == "[" { continue
if err := sub.parseSubmoduleName(s); err != nil { }
if line[0] == '[' {
if sub != nil {
ret = append(ret, *sub)
}
sub = &Submodule{}
if err := sub.parseSubmoduleName(line[1:]); err != nil {
return nil, err
}
} else if sub == nil {
return nil, SyntaxError
} else {
if err := sub.parseKeyValue(line); err != nil {
return nil, err return nil, err
} }
} }
}
if sub != nil {
ret = append(ret, *sub) ret = append(ret, *sub)
} }
return ret, nil return ret, nil