map.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package xml
  2. // mapEntryWrapper is the default member wrapper start element for XML Map entry
  3. var mapEntryWrapper = StartElement{
  4. Name: Name{Local: "entry"},
  5. }
  6. // Map represents the encoding of a XML map type
  7. type Map struct {
  8. w writer
  9. scratch *[]byte
  10. // member start element is the map entry wrapper start element
  11. memberStartElement StartElement
  12. // isFlattened returns true if the map is a flattened map
  13. isFlattened bool
  14. }
  15. // newMap returns a map encoder which sets the default map
  16. // entry wrapper to `entry`.
  17. //
  18. // A map `someMap : {{key:"abc", value:"123"}}` is represented as
  19. // `<someMap><entry><key>abc<key><value>123</value></entry></someMap>`.
  20. func newMap(w writer, scratch *[]byte) *Map {
  21. return &Map{
  22. w: w,
  23. scratch: scratch,
  24. memberStartElement: mapEntryWrapper,
  25. }
  26. }
  27. // newFlattenedMap returns a map encoder which sets the map
  28. // entry wrapper to the passed in memberWrapper`.
  29. //
  30. // A flattened map `someMap : {{key:"abc", value:"123"}}` is represented as
  31. // `<someMap><key>abc<key><value>123</value></someMap>`.
  32. func newFlattenedMap(w writer, scratch *[]byte, memberWrapper StartElement) *Map {
  33. return &Map{
  34. w: w,
  35. scratch: scratch,
  36. memberStartElement: memberWrapper,
  37. isFlattened: true,
  38. }
  39. }
  40. // Entry returns a Value encoder with map's element.
  41. // It writes the member wrapper start tag for each entry.
  42. func (m *Map) Entry() Value {
  43. v := newValue(m.w, m.scratch, m.memberStartElement)
  44. v.isFlattened = m.isFlattened
  45. return v
  46. }