1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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
- }
|