github.com/naemono/pop@v4.13.1+incompatible/slices/map.go (about)

     1  package slices
     2  
     3  import (
     4  	"database/sql/driver"
     5  	"encoding/json"
     6  
     7  	"errors"
     8  )
     9  
    10  // Map is a map[string]interface.
    11  type Map map[string]interface{}
    12  
    13  // Interface implements the nulls.nullable interface.
    14  func (m Map) Interface() interface{} {
    15  	return map[string]interface{}(m)
    16  }
    17  
    18  // Scan implements the sql.Scanner interface.
    19  // It allows to read the map from the database value.
    20  func (m *Map) Scan(src interface{}) error {
    21  	b, ok := src.([]byte)
    22  	if !ok {
    23  		return errors.New("scan source was not []byte")
    24  	}
    25  	err := json.Unmarshal(b, m)
    26  	if err != nil {
    27  		return err
    28  	}
    29  	return nil
    30  }
    31  
    32  // Value implements the driver.Valuer interface.
    33  // It allows to convert the map to a driver.value.
    34  func (m Map) Value() (driver.Value, error) {
    35  	b, err := json.Marshal(m)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	return string(b), nil
    40  }
    41  
    42  // UnmarshalJSON will unmarshall JSON value into
    43  // the map representation of this value.
    44  func (m Map) UnmarshalJSON(b []byte) error {
    45  	var stuff map[string]interface{}
    46  	err := json.Unmarshal(b, &stuff)
    47  	if err != nil {
    48  		return err
    49  	}
    50  	for key, value := range stuff {
    51  		m[key] = value
    52  	}
    53  	return nil
    54  }
    55  
    56  // UnmarshalText will unmarshall text value into
    57  // the map representation of this value.
    58  func (m Map) UnmarshalText(text []byte) error {
    59  	err := json.Unmarshal(text, &m)
    60  	if err != nil {
    61  		return err
    62  	}
    63  	return nil
    64  }