github.com/twilio/twilio-go@v1.20.1/twiml/twiml.go (about) 1 package twiml 2 3 import ( 4 "strings" 5 6 "github.com/beevik/etree" 7 ) 8 9 type Element interface { 10 GetName() string 11 GetText() string 12 GetAttr() (map[string]string, map[string]string) 13 GetInnerElements() []Element 14 } 15 16 func AddAllVerbs(response *etree.Element, verbs []Element) { 17 for _, verb := range verbs { 18 verbEl := createElement(verb) 19 response.AddChild(verbEl) 20 } 21 } 22 23 func createElement(element Element) *etree.Element { 24 el := etree.NewElement(element.GetName()) 25 optAttr, paramAttr := element.GetAttr() 26 addPropertyToElement(el, element.GetText(), optAttr, paramAttr) 27 //Loop through all Inner Elements 28 if len(element.GetInnerElements()) != 0 { 29 for _, innerElement := range element.GetInnerElements() { 30 child := createElement(innerElement) 31 el.AddChild(child) 32 } 33 } 34 return el 35 } 36 37 func CreateDocument() (*etree.Document, *etree.Element) { 38 doc := etree.NewDocument() 39 doc.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`) 40 element := doc.CreateElement("Response") 41 return doc, element 42 } 43 44 func ToXML(document *etree.Document) (string, error) { 45 return document.WriteToString() 46 } 47 48 func addPropertyToElement(treeElement *etree.Element, text string, optAttr map[string]string, paramAttr map[string]string) { 49 if text != "" { 50 treeElement.SetText(text) 51 } 52 53 for _, attr := range []map[string]string{paramAttr, optAttr} { 54 for k, v := range attr { 55 if v != "" { 56 treeElement.CreateAttr(formatAttrKey(k), v) 57 } 58 } 59 } 60 } 61 62 func formatAttrKey(s string) string { 63 return strings.ToLower(string(s[0])) + s[1:] 64 }