wip
This commit is contained in:
parent
12a641c86f
commit
c7723fce2d
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user