src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

metadata.go (1832B)


      1 package middleware
      2 
      3 // MetadataReader provides an interface for reading metadata from the
      4 // underlying metadata container.
      5 type MetadataReader interface {
      6 	Get(key interface{}) interface{}
      7 }
      8 
      9 // Metadata provides storing and reading metadata values. Keys may be any
     10 // comparable value type. Get and set will panic if key is not a comparable
     11 // value type.
     12 //
     13 // Metadata uses lazy initialization, and Set method must be called as an
     14 // addressable value, or pointer. Not doing so may cause key/value pair to not
     15 // be set.
     16 type Metadata struct {
     17 	values map[interface{}]interface{}
     18 }
     19 
     20 // Get attempts to retrieve the value the key points to. Returns nil if the
     21 // key was not found.
     22 //
     23 // Panics if key type is not comparable.
     24 func (m Metadata) Get(key interface{}) interface{} {
     25 	return m.values[key]
     26 }
     27 
     28 // Clone creates a shallow copy of Metadata entries, returning a new Metadata
     29 // value with the original entries copied into it.
     30 func (m Metadata) Clone() Metadata {
     31 	vs := make(map[interface{}]interface{}, len(m.values))
     32 	for k, v := range m.values {
     33 		vs[k] = v
     34 	}
     35 
     36 	return Metadata{
     37 		values: vs,
     38 	}
     39 }
     40 
     41 // Set stores the value pointed to by the key. If a value already exists at
     42 // that key it will be replaced with the new value.
     43 //
     44 // Set method must be called as an addressable value, or pointer. If Set is not
     45 // called as an addressable value or pointer, the key value pair being set may
     46 // be lost.
     47 //
     48 // Panics if the key type is not comparable.
     49 func (m *Metadata) Set(key, value interface{}) {
     50 	if m.values == nil {
     51 		m.values = map[interface{}]interface{}{}
     52 	}
     53 	m.values[key] = value
     54 }
     55 
     56 // Has returns whether the key exists in the metadata.
     57 //
     58 // Panics if the key type is not comparable.
     59 func (m Metadata) Has(key interface{}) bool {
     60 	if m.values == nil {
     61 		return false
     62 	}
     63 	_, ok := m.values[key]
     64 	return ok
     65 }