1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
package rundeck
import (
"encoding/xml"
"fmt"
"sort"
)
func marshalMapToXML(c *map[string]string, e *xml.Encoder, start xml.StartElement, entryName string, keyName string, valueName string) error {
if len(*c) == 0 {
return nil
}
e.EncodeToken(start)
// Sort the keys so we'll have a deterministic result.
keys := []string{}
for k, _ := range *c {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
v := (*c)[k]
e.EncodeToken(xml.StartElement{
Name: xml.Name{Local: entryName},
Attr: []xml.Attr{
xml.Attr{
Name: xml.Name{Local: keyName},
Value: k,
},
xml.Attr{
Name: xml.Name{Local: valueName},
Value: v,
},
},
})
e.EncodeToken(xml.EndElement{xml.Name{Local: entryName}})
}
e.EncodeToken(xml.EndElement{start.Name})
return nil
}
func unmarshalMapFromXML(c *map[string]string, d *xml.Decoder, start xml.StartElement, entryName string, keyName string, valueName string) error {
result := map[string]string{}
for {
token, err := d.Token()
if token == nil {
err = fmt.Errorf("EOF while decoding job command plugin config")
}
if err != nil {
return err
}
switch t := token.(type) {
default:
continue
case xml.StartElement:
if t.Name.Local != entryName {
return fmt.Errorf("unexpected element %s while looking for config entries", t.Name.Local)
}
var k string
var v string
for _, attr := range t.Attr {
if attr.Name.Local == keyName {
k = attr.Value
} else if attr.Name.Local == valueName {
v = attr.Value
}
}
if k == "" {
return fmt.Errorf("found config entry with empty key")
}
result[k] = v
case xml.EndElement:
if t.Name.Local == start.Name.Local {
*c = result
return nil
}
}
}
}
|