Server/go/apptoken/apptokenOptions.go (92 lines of code) (raw):
package apptoken
import (
"bytes"
"encoding/binary"
"errors"
"io"
"sort"
)
type AppTokenOptions struct {
EngineOptions map[string]string
}
func CreateAppTokenOptions() AppTokenOptions {
return AppTokenOptions{
EngineOptions: make(map[string]string),
}
}
func (options *AppTokenOptions) SetEngineOptions(engineOptions map[string]string) {
options.EngineOptions = engineOptions
}
func (options *AppTokenOptions) Pack() ([]byte, error) {
buf := new(bytes.Buffer)
// hasEngineOptions
hasEngineOptions := options.EngineOptions != nil
if err := binary.Write(buf, binary.BigEndian, hasEngineOptions); err != nil {
return nil, err
}
if hasEngineOptions {
if err := binary.Write(buf, binary.BigEndian, int32(len(options.EngineOptions))); err != nil {
return nil, err
}
if len(options.EngineOptions) > 0 {
// sort by key
keys := make([]string, 0, len(options.EngineOptions))
for k := range options.EngineOptions {
keys = append(keys, k)
}
sort.Strings(keys)
for _, key := range keys {
value := options.EngineOptions[key]
if key == "" || value == "" {
return nil, errors.New("illegal engineOptions entry")
}
if err := binary.Write(buf, binary.BigEndian, int32(len(key))); err != nil {
return nil, err
}
if _, err := buf.Write([]byte(key)); err != nil {
return nil, err
}
if err := binary.Write(buf, binary.BigEndian, int32(len(value))); err != nil {
return nil, err
}
if _, err := buf.Write([]byte(value)); err != nil {
return nil, err
}
}
}
}
return buf.Bytes(), nil
}
func UnpackAppTokenOptions(buf io.Reader) (*AppTokenOptions, error) {
options := &AppTokenOptions{
EngineOptions: make(map[string]string),
}
// hasEngineOptions
var hasEngineOptions bool
if err := binary.Read(buf, binary.BigEndian, &hasEngineOptions); err != nil {
return nil, err
}
if hasEngineOptions {
var size int32
if err := binary.Read(buf, binary.BigEndian, &size); err != nil {
return nil, err
}
for i := int32(0); i < size; i++ {
var keyLength int32
if err := binary.Read(buf, binary.BigEndian, &keyLength); err != nil {
return nil, err
}
key := make([]byte, keyLength)
if _, err := buf.Read(key); err != nil {
return nil, err
}
var valueLength int32
if err := binary.Read(buf, binary.BigEndian, &valueLength); err != nil {
return nil, err
}
value := make([]byte, valueLength)
if _, err := buf.Read(value); err != nil {
return nil, err
}
options.EngineOptions[string(key)] = string(value)
}
}
return options, nil
}