package httpsfv
import (
"errors"
"strings"
)
var ErrInvalidListFormat = errors .New ("invalid list format" )
type List []Member
func (l List ) marshalSFV (b *strings .Builder ) error {
s := len (l )
for i := 0 ; i < s ; i ++ {
if err := l [i ].marshalSFV (b ); err != nil {
return err
}
if i != s -1 {
if _ , err := b .WriteString (", " ); err != nil {
return err
}
}
}
return nil
}
func UnmarshalList (v []string ) (List , error ) {
s := &scanner {
data : strings .Join (v , "," ),
}
s .scanWhileSp ()
sfv , err := parseList (s )
if err != nil {
return List {}, err
}
return sfv , nil
}
func parseList(s *scanner ) (List , error ) {
var l List
for !s .eof () {
m , err := parseItemOrInnerList (s )
if err != nil {
return nil , err
}
l = append (l , m )
s .scanWhileOWS ()
if s .eof () {
return l , nil
}
if s .data [s .off ] != ',' {
return nil , &UnmarshalError {s .off , ErrInvalidListFormat }
}
s .off ++
s .scanWhileOWS ()
if s .eof () {
return nil , &UnmarshalError {s .off , ErrInvalidListFormat }
}
}
return l , nil
}
func parseItemOrInnerList(s *scanner ) (Member , error ) {
if s .eof () {
return nil , &UnmarshalError {s .off , ErrInvalidInnerListFormat }
}
if s .data [s .off ] == '(' {
return parseInnerList (s )
}
return parseItem (s )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .