mirror of https://github.com/docker/cli.git
87 lines
2.0 KiB
Go
87 lines
2.0 KiB
Go
|
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
|
||
|
}
|