From c5511c23332404a4a90445f6634e1f98e98115ff Mon Sep 17 00:00:00 2001 From: "Ryan S. Brown" Date: Sun, 6 Dec 2015 15:26:06 -0500 Subject: [PATCH 1/2] Add custom XML serializer for instance metadata --- marshal.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/marshal.go b/marshal.go index 9af0290..d6a20b0 100644 --- a/marshal.go +++ b/marshal.go @@ -4,6 +4,7 @@ package fargo import ( "encoding/json" + "encoding/xml" "strconv" ) @@ -120,3 +121,26 @@ func (i *InstanceMetadata) MarshalJSON() ([]byte, error) { return i.Raw, nil } + +// MarshalXML is a custom XML marshaler for InstanceMetadata. +func (i InstanceMetadata) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + tokens := []xml.Token{start} + + if i.parsed != nil { + for key, value := range i.parsed { + t := xml.StartElement{Name: xml.Name{"", key}} + tokens = append(tokens, t, xml.CharData(value.(string)), xml.EndElement{t.Name}) + } + } + tokens = append(tokens, xml.EndElement{start.Name}) + + for _, t := range tokens { + err := e.EncodeToken(t) + if err != nil { + return err + } + } + + // flush to ensure tokens are written + return e.Flush() +} From bf62a0025170652e6fdda37fdc1facc19c4451dc Mon Sep 17 00:00:00 2001 From: "Ryan S. Brown" Date: Sun, 6 Dec 2015 15:26:17 -0500 Subject: [PATCH 2/2] Add more tests for serializers --- tests/metadata_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/metadata_test.go b/tests/metadata_test.go index 8d9addb..dd06c1f 100644 --- a/tests/metadata_test.go +++ b/tests/metadata_test.go @@ -3,6 +3,7 @@ package fargo_test // MIT Licensed (see README.md) - Copyright (c) 2013 Hudl <@Hudl> import ( + "encoding/xml" "github.com/hudl/fargo" . "github.com/smartystreets/goconvey/convey" "strconv" @@ -58,3 +59,28 @@ func TestGetFloat(t *testing.T) { }) }) } + +func TestSerializeMeta(t *testing.T) { + Convey("Given an instance", t, func() { + instance := new(fargo.Instance) + Convey("With metadata", func() { + instance.SetMetadataString("test", "value") + Convey("Serializing results in correct JSON", func() { + b, err := instance.Metadata.MarshalJSON() + So(err, ShouldBeNil) + So(string(b), ShouldEqual, "{\"test\":\"value\"}") + }) + Convey("Serializing results in correct XML", func() { + b, err := xml.Marshal(instance.Metadata) + So(err, ShouldBeNil) + So(string(b), ShouldEqual, "value") + }) + Convey("Blank metadata results in blank XML", func() { + metadata := new(fargo.InstanceMetadata) + b, err := xml.Marshal(metadata) + So(err, ShouldBeNil) + So(string(b), ShouldEqual, "") + }) + }) + }) +}