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" ) // NamedModel associates a name with a Model (not using its Id) type NamedModel struct { Name string Model Model } // ModelList encapsulates a list of NamedModel (association) type ModelList struct { List []NamedModel } // Put adds or replaces a Model by its name func (l *ModelList) Put(name string, model Model) { for i, each := range l.List { if each.Name == name { // replace l.List[i] = NamedModel{name, model} return } } // add l.List = append(l.List, NamedModel{name, model}) } // At returns a Model by its name, ok is false if absent func (l *ModelList) At(name string) (m Model, ok bool) { for _, each := range l.List { if each.Name == name { return each.Model, true } } return m, false } // Do enumerates all the models, each with its assigned name func (l *ModelList) Do(block func(name string, value Model)) { for _, each := range l.List { block(each.Name, each.Model) } } // MarshalJSON writes the ModelList as if it was a map[string]Model func (l ModelList) 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.Model) if i < len(l.List)-1 { buf.WriteString(",\n") } } buf.WriteString("}") return buf.Bytes(), nil } // UnmarshalJSON reads back a ModelList. This is an expensive operation. func (l *ModelList) 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 Model json.NewDecoder(bytes.NewReader(data)).Decode(&m) l.Put(k, m) } return nil }