package httpsfv
import (
"errors"
"strings"
)
type Dictionary struct {
names []string
values map [string ]Member
}
var ErrInvalidDictionaryFormat = errors .New ("invalid dictionary format" )
func NewDictionary () *Dictionary {
d := Dictionary {}
d .names = []string {}
d .values = map [string ]Member {}
return &d
}
func (d *Dictionary ) Get (k string ) (Member , bool ) {
v , ok := d .values [k ]
return v , ok
}
func (d *Dictionary ) Add (k string , v Member ) {
if _ , exists := d .values [k ]; !exists {
d .names = append (d .names , k )
}
d .values [k ] = v
}
func (d *Dictionary ) Del (key string ) bool {
if _ , ok := d .values [key ]; !ok {
return false
}
for i , k := range d .names {
if k == key {
d .names = append (d .names [:i ], d .names [i +1 :]...)
break
}
}
delete (d .values , key )
return true
}
func (d *Dictionary ) Names () []string {
return d .names
}
func (d *Dictionary ) marshalSFV (b *strings .Builder ) error {
last := len (d .names ) - 1
for m , k := range d .names {
if err := marshalKey (b , k ); err != nil {
return err
}
v := d .values [k ]
if item , ok := v .(Item ); ok && item .Value == true {
if err := item .Params .marshalSFV (b ); err != nil {
return err
}
} else {
if err := b .WriteByte ('=' ); err != nil {
return err
}
if err := v .marshalSFV (b ); err != nil {
return err
}
}
if m != last {
if _ , err := b .WriteString (", " ); err != nil {
return err
}
}
}
return nil
}
func UnmarshalDictionary (v []string ) (*Dictionary , error ) {
s := &scanner {
data : strings .Join (v , "," ),
}
s .scanWhileSp ()
sfv , err := parseDictionary (s )
if err != nil {
return sfv , err
}
return sfv , nil
}
func parseDictionary(s *scanner ) (*Dictionary , error ) {
d := NewDictionary ()
for !s .eof () {
k , err := parseKey (s )
if err != nil {
return nil , err
}
var m Member
if !s .eof () && s .data [s .off ] == '=' {
s .off ++
m , err = parseItemOrInnerList (s )
if err != nil {
return nil , err
}
} else {
p , err := parseParams (s )
if err != nil {
return nil , err
}
m = Item {true , p }
}
d .Add (k , m )
s .scanWhileOWS ()
if s .eof () {
return d , nil
}
if s .data [s .off ] != ',' {
return nil , &UnmarshalError {s .off , ErrInvalidDictionaryFormat }
}
s .off ++
s .scanWhileOWS ()
if s .eof () {
return nil , &UnmarshalError {s .off , ErrInvalidDictionaryFormat }
}
}
return d , nil
}
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 .