kawipiko/sources/lib/metadata.go

59 lines
1.3 KiB
Go
Raw Normal View History

package lib
import "bytes"
import "fmt"
import "regexp"
func MetadataEncode (_metadata map[string]string) ([]byte, error) {
_buffer := & bytes.Buffer {}
for _key, _value := range _metadata {
if ! metadataKeyRegex.MatchString (_key) {
return nil, fmt.Errorf ("[2f761e02] invalid metadata key: `%s`", _key)
}
if _value == "" {
continue
}
if ! metadataValueRegex.MatchString (_value) {
return nil, fmt.Errorf ("[e8faf5bd] invalid metadata value: `%s`", _value)
}
_buffer.Write ([]byte (_key))
_buffer.Write ([]byte (" : "))
_buffer.Write ([]byte (_value))
_buffer.Write ([]byte ("\n"))
}
_data := _buffer.Bytes ()
return _data, nil
}
func MetadataDecode (_data []byte) ([][2]string, error) {
_metadata := make ([][2]string, 0, 16)
for _, _data := range bytes.Split (_data, []byte ("\n")) {
if len (_data) == 0 {
continue
}
_data := bytes.SplitN (_data, []byte (" : "), 2)
if len (_data) == 2 {
_metadata = append (_metadata, [2]string { string (_data[0]), string (_data[1]) })
} else {
return nil, fmt.Errorf ("[7cb30bf7] invalid metadata encoding")
}
}
return _metadata, nil
}
var metadataKeyRegex *regexp.Regexp = regexp.MustCompile (`\A[a-z0-9](?:[a-z0-9-]?[a-z]+)*\z`)
var metadataValueRegex *regexp.Regexp = regexp.MustCompile (`\A[[:graph:]](?: ?[[:graph:]]+)*\z`)