model_list.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package swagger
  2. // Copyright 2015 Ernest Micklei. All rights reserved.
  3. // Use of this source code is governed by a license
  4. // that can be found in the LICENSE file.
  5. import (
  6. "bytes"
  7. "encoding/json"
  8. )
  9. // NamedModel associates a name with a Model (not using its Id)
  10. type NamedModel struct {
  11. Name string
  12. Model Model
  13. }
  14. // ModelList encapsulates a list of NamedModel (association)
  15. type ModelList struct {
  16. List []NamedModel
  17. }
  18. // Put adds or replaces a Model by its name
  19. func (l *ModelList) Put(name string, model Model) {
  20. for i, each := range l.List {
  21. if each.Name == name {
  22. // replace
  23. l.List[i] = NamedModel{name, model}
  24. return
  25. }
  26. }
  27. // add
  28. l.List = append(l.List, NamedModel{name, model})
  29. }
  30. // At returns a Model by its name, ok is false if absent
  31. func (l *ModelList) At(name string) (m Model, ok bool) {
  32. for _, each := range l.List {
  33. if each.Name == name {
  34. return each.Model, true
  35. }
  36. }
  37. return m, false
  38. }
  39. // Do enumerates all the models, each with its assigned name
  40. func (l *ModelList) Do(block func(name string, value Model)) {
  41. for _, each := range l.List {
  42. block(each.Name, each.Model)
  43. }
  44. }
  45. // MarshalJSON writes the ModelList as if it was a map[string]Model
  46. func (l ModelList) MarshalJSON() ([]byte, error) {
  47. var buf bytes.Buffer
  48. encoder := json.NewEncoder(&buf)
  49. buf.WriteString("{\n")
  50. for i, each := range l.List {
  51. buf.WriteString("\"")
  52. buf.WriteString(each.Name)
  53. buf.WriteString("\": ")
  54. encoder.Encode(each.Model)
  55. if i < len(l.List)-1 {
  56. buf.WriteString(",\n")
  57. }
  58. }
  59. buf.WriteString("}")
  60. return buf.Bytes(), nil
  61. }
  62. // UnmarshalJSON reads back a ModelList. This is an expensive operation.
  63. func (l *ModelList) UnmarshalJSON(data []byte) error {
  64. raw := map[string]interface{}{}
  65. json.NewDecoder(bytes.NewReader(data)).Decode(&raw)
  66. for k, v := range raw {
  67. // produces JSON bytes for each value
  68. data, err := json.Marshal(v)
  69. if err != nil {
  70. return err
  71. }
  72. var m Model
  73. json.NewDecoder(bytes.NewReader(data)).Decode(&m)
  74. l.Put(k, m)
  75. }
  76. return nil
  77. }