structs.go
changeset 38 2839fece923e
parent 37 fbda8e925fdf
child 40 33e7f25f1fd2
--- a/structs.go	Sat Dec 31 10:11:01 2011 -0700
+++ b/structs.go	Sat Dec 31 11:39:23 2011 -0700
@@ -94,15 +94,12 @@
 	// A nested error element, if any.
 	XError() *Error
 	// A (non-error) nested element, if any.
-	XChild() *Generic
+	XNested() interface{}
+	setNested(interface{})
+	generic() *Generic
 	innerxml() string
 }
 
-type ExtendedStanza interface {
-	Stanza
-	InnerMarshal(io.Writer) os.Error
-}
-
 // message stanza
 type Message struct {
 	To string `xml:"attr"`
@@ -116,10 +113,10 @@
 	Body *Generic
 	Thread *Generic
 	Any *Generic
+	Nested interface{}
 }
 var _ xml.Marshaler = &Message{}
 var _ Stanza = &Message{}
-var _ ExtendedStanza = &Message{}
 
 // presence stanza
 type Presence struct {
@@ -134,10 +131,10 @@
 	Status *Generic
 	Priority *Generic
 	Any *Generic
+	Nested interface{}
 }
 var _ xml.Marshaler = &Presence{}
 var _ Stanza = &Presence{}
-var _ ExtendedStanza = &Presence{}
 
 // iq stanza
 type Iq struct {
@@ -149,6 +146,7 @@
 	Innerxml string `xml:"innerxml"`
 	Error *Error
 	Any *Generic
+	Nested interface{}
 }
 var _ xml.Marshaler = &Iq{}
 var _ Stanza = &Iq{}
@@ -295,23 +293,15 @@
 		writeField(buf, "xml:lang", st.XLang())
 	}
 	buf.WriteString(">")
-	if ext, ok := st.(ExtendedStanza) ; ok {
-		if st.XError() != nil {
-			bytes, _ := st.XError().MarshalXML()
-			buf.WriteString(string(bytes))
-		}
-		err := ext.InnerMarshal(buf)
-		if err != nil {
-			return nil, err
-		}
-	} else {
-		inner := st.innerxml()
-		if inner == "" {
-			xml.Marshal(buf, st.XChild())
-		} else {
-			buf.WriteString(st.innerxml())
-		}
+
+	if st.XNested() != nil {
+		xml.Marshal(buf, st.XNested())
+	} else if st.generic() != nil {
+		xml.Marshal(buf, st.generic())
+	} else if st.innerxml() != "" {
+		buf.WriteString(st.innerxml())
 	}
+
 	buf.WriteString("</")
 	buf.WriteString(st.XName())
 	buf.WriteString(">")
@@ -363,7 +353,15 @@
 	return m.Error
 }
 
-func (m *Message) XChild() *Generic {
+func (m *Message) XNested() interface{} {
+	return m.Nested
+}
+
+func (m *Message) setNested(n interface{}) {
+	m.Nested = n
+}
+
+func (m *Message) generic() *Generic {
 	return m.Any
 }
 
@@ -419,7 +417,15 @@
 	return p.Error
 }
 
-func (p *Presence) XChild() *Generic {
+func (p *Presence) XNested() interface{} {
+	return p.Nested
+}
+
+func (p *Presence) setNested(n interface{}) {
+	p.Nested = n
+}
+
+func (p *Presence) generic() *Generic {
 	return p.Any
 }
 
@@ -475,7 +481,15 @@
 	return iq.Error
 }
 
-func (iq *Iq) XChild() *Generic {
+func (iq *Iq) XNested() interface{} {
+	return iq.Nested
+}
+
+func (iq *Iq) setNested(n interface{}) {
+	iq.Nested = n
+}
+
+func (iq *Iq) generic() *Generic {
 	return iq.Any
 }