package swagger // Copyright 2015 Ernest Micklei. All rights reserved. // Use of this source code is governed by a license // that can be found in the LICENSE file. import ( "bytes" "encoding/json" ) // NamedModelProperty associates a name to a ModelProperty type NamedModelProperty struct { Name string Property ModelProperty } // ModelPropertyList encapsulates a list of NamedModelProperty (association) type ModelPropertyList struct { List []NamedModelProperty } // At returns the ModelPropety by its name unless absent, then ok is false func (l *ModelPropertyList) At(name string) (p ModelProperty, ok bool) { for _, each := range l.List { if each.Name == name { return each.Property, true } } return p, false } // Put adds or replaces a ModelProperty with this name func (l *ModelPropertyList) Put(name string, prop ModelProperty) { // maybe replace existing for i, each := range l.List { if each.Name == name { // replace l.List[i] = NamedModelProperty{Name: name, Property: prop} return } } // add l.List = append(l.List, NamedModelProperty{Name: name, Property: prop}) } // Do enumerates all the properties, each with its assigned name func (l *ModelPropertyList) Do(block func(name string, value ModelProperty)) { for _, each := range l.List { block(each.Name, each.Property) } } // MarshalJSON writes the ModelPropertyList as if it was a map[string]ModelProperty func (l ModelPropertyList) MarshalJSON() ([]byte, error) { var buf bytes.Buffer encoder := json.NewEncoder(&buf) buf.WriteString("{\n") for i, each := range l.List { buf.WriteString("\"") buf.WriteString(each.Name) buf.WriteString("\": ") encoder.Encode(each.Property) if i < len(l.List)-1 { buf.WriteString(",\n") } } buf.WriteString("}") return buf.Bytes(), nil } // UnmarshalJSON reads back a ModelPropertyList. This is an expensive operation. func (l *ModelPropertyList) UnmarshalJSON(data []byte) error { raw := map[string]interface{}{} json.NewDecoder(bytes.NewReader(data)).Decode(&raw) for k, v := range raw { // produces JSON bytes for each value data, err := json.Marshal(v) if err != nil { return err } var m ModelProperty json.NewDecoder(bytes.NewReader(data)).Decode(&m) l.Put(k, m) } return nil }