diff --git a/container/mts/meta/meta.go b/container/mts/meta/meta.go index 0e67aa96..d3c6a8a9 100644 --- a/container/mts/meta/meta.go +++ b/container/mts/meta/meta.go @@ -90,6 +90,17 @@ func NewWith(data [][2]string) *Data { return m } +// NewFromMap creates a meta.Data from a map. +func NewFromMap(data map[string]string) *Data { + m := New() + m.order = make([]string, 0, len(data)) + for k, v := range data { + m.data[k] = v + m.order = append(m.order, k) + } + return m +} + // Add adds metadata with key and val. func (m *Data) Add(key, val string) { m.mu.Lock() @@ -167,6 +178,23 @@ func (m *Data) Encode() []byte { return m.enc } +// EncodeAsString takes the meta data map and encodes into a string with the data in +// TSV format. Unlike encode, the header with version and length of data is not +// included. This method is used for storing metadata in the store on vidgrind. +func (m *Data) EncodeAsString() string { + // Iterate over map and append entries, only adding tab if we're not on the + // last entry. + var str string + for i, k := range m.order { + v := m.data[k] + str += k + "=" + v + if i+1 < len(m.data) { + str += "\t" + } + } + return str +} + // Keys returns all keys in a slice of metadata d. func Keys(d []byte) ([]string, error) { m, err := GetAll(d) @@ -227,9 +255,15 @@ func GetAllAsMap(d []byte) (map[string]string, error) { // Skip the header, which is our data length and version. d = d[headSize:] + return GetAllFromString(string(d)) +} + +// GetAllFromString returns a map containing keys and values from a string s containing +// metadata. +func GetAllFromString(s string) (map[string]string, error) { // Each metadata entry (key and value) is seperated by a tab, so split at tabs // to get individual entries. - entries := strings.Split(string(d), "\t") + entries := strings.Split(s, "\t") // Go through entries and add to all map. all := make(map[string]string)