launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/environs/simplestreams/json.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package simplestreams
     5  
     6  import (
     7  	"encoding/json"
     8  	"reflect"
     9  )
    10  
    11  // itemCollection is a clone of ItemCollection, but
    12  // does not implement json.Unmarshaler.
    13  type itemCollection struct {
    14  	Items      map[string]*json.RawMessage `json:"items"`
    15  	Arch       string                      `json:"arch,omitempty"`
    16  	Version    string                      `json:"version,omitempty"`
    17  	Series     string                      `json:"release,omitempty"`
    18  	RegionName string                      `json:"region,omitempty"`
    19  	Endpoint   string                      `json:"endpoint,omitempty"`
    20  }
    21  
    22  // ItemsCollection.UnmarshalJSON unmarshals the ItemCollection,
    23  // storing the raw bytes for each item. These can later be
    24  // unmarshalled again into product-specific types.
    25  func (c *ItemCollection) UnmarshalJSON(b []byte) error {
    26  	var raw itemCollection
    27  	if err := json.Unmarshal(b, &raw); err != nil {
    28  		return err
    29  	}
    30  	c.rawItems = raw.Items
    31  	c.Items = make(map[string]interface{}, len(raw.Items))
    32  	c.Arch = raw.Arch
    33  	c.Version = raw.Version
    34  	c.Series = raw.Series
    35  	c.RegionName = raw.RegionName
    36  	c.Endpoint = raw.Endpoint
    37  	for key, rawv := range raw.Items {
    38  		var v interface{}
    39  		if err := json.Unmarshal([]byte(*rawv), &v); err != nil {
    40  			return err
    41  		}
    42  		c.Items[key] = v
    43  	}
    44  	return nil
    45  }
    46  
    47  func (c *ItemCollection) construct(itemType reflect.Type) error {
    48  	for key, rawv := range c.rawItems {
    49  		itemValuePtr := reflect.New(itemType)
    50  		err := json.Unmarshal([]byte(*rawv), itemValuePtr.Interface())
    51  		if err != nil {
    52  			return err
    53  		}
    54  		c.Items[key] = itemValuePtr.Interface()
    55  	}
    56  	return nil
    57  }