[common] Add support for iterating over decoded metadata thus eliminating allocations
This commit is contained in:
parent
f7d3539e4f
commit
72489042d6
1 changed files with 37 additions and 11 deletions
|
@ -39,19 +39,45 @@ func MetadataEncode (_metadata map[string]string) ([]byte, error) {
|
||||||
|
|
||||||
func MetadataDecode (_data []byte) ([][2]string, error) {
|
func MetadataDecode (_data []byte) ([][2]string, error) {
|
||||||
_metadata := make ([][2]string, 0, 16)
|
_metadata := make ([][2]string, 0, 16)
|
||||||
for _, _data := range bytes.Split (_data, []byte ("\n")) {
|
_metadataAppend := func (_key []byte, _value []byte) () {
|
||||||
if len (_data) == 0 {
|
_metadata = append (_metadata, [2]string { string (_key), string (_value) })
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
_data := bytes.SplitN (_data, []byte (" : "), 2)
|
if _error := MetadataDecodeIterate (_data, _metadataAppend); _error != nil {
|
||||||
if len (_data) == 2 {
|
return nil, _error
|
||||||
_metadata = append (_metadata, [2]string { string (_data[0]), string (_data[1]) })
|
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf ("[7cb30bf7] invalid metadata encoding")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _metadata, nil
|
return _metadata, nil
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MetadataDecodeIterate (_data []byte, _callback func ([]byte, []byte) ()) (error) {
|
||||||
|
|
||||||
|
_dataSize := len (_data)
|
||||||
|
_headerOffset := 0
|
||||||
|
|
||||||
|
for {
|
||||||
|
|
||||||
|
if _headerOffset == _dataSize {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
_data := _data[_headerOffset :]
|
||||||
|
_headerLimit := bytes.IndexByte (_data, '\n')
|
||||||
|
if (_headerLimit == -1) {
|
||||||
|
return fmt.Errorf ("[2d0d442a] invalid metadata encoding")
|
||||||
|
}
|
||||||
|
_headerOffset += _headerLimit + 1
|
||||||
|
|
||||||
|
_data = _data[: _headerLimit]
|
||||||
|
_separator := bytes.Index (_data, []byte (" : "))
|
||||||
|
if _separator == -1 {
|
||||||
|
return fmt.Errorf ("[41f3756c] invalid metadata encoding")
|
||||||
|
}
|
||||||
|
_key := _data[: _separator]
|
||||||
|
_value := _data[_separator + 3 :]
|
||||||
|
|
||||||
|
_callback (_key, _value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue