diff -r 63f33bb8fa33 -r ccfebbd9f49b xmpp/structs.go --- a/xmpp/structs.go Wed Nov 06 20:40:50 2013 -0700 +++ b/xmpp/structs.go Sat Nov 09 12:09:37 2013 -0700 @@ -5,11 +5,9 @@ import ( "bytes" "encoding/xml" - "flag" "fmt" "log" "reflect" - "regexp" "strings" ) @@ -19,14 +17,7 @@ // JID represents an entity that can communicate with other // entities. It looks like node@domain/resource. Node and resource are // sometimes optional. -type JID struct { - Node string - Domain string - Resource string -} - -var _ fmt.Stringer = &JID{} -var _ flag.Value = &JID{} +type JID string // XMPP's XML element type stream struct { @@ -98,8 +89,8 @@ type Message struct { XMLName xml.Name `xml:"jabber:client message"` Header - Subject []Text `xml:"jabber:client subject"` - Body []Text `xml:"jabber:client body"` + Subject []Text `xml:"jabber:client subject"` + Body []Text `xml:"jabber:client body"` Thread *Data `xml:"jabber:client thread"` } @@ -109,9 +100,9 @@ type Presence struct { XMLName xml.Name `xml:"presence"` Header - Show *Data `xml:"jabber:client show"` - Status []Text `xml:"jabber:client status"` - Priority *Data `xml:"jabber:client priority"` + Show *Data `xml:"jabber:client show"` + Status []Text `xml:"jabber:client status"` + Priority *Data `xml:"jabber:client priority"` } var _ Stanza = &Presence{} @@ -147,14 +138,14 @@ // together, allowing the software to choose which language to present // to the user. type Text struct { - XMLName xml.Name + XMLName xml.Name Lang string `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"` Chardata string `xml:",chardata"` } // Non-human-readable content of some sort, used by the protocol. type Data struct { - XMLName xml.Name + XMLName xml.Name Chardata string `xml:",chardata"` } @@ -167,31 +158,29 @@ var _ fmt.Stringer = &Generic{} -func (jid *JID) String() string { - result := jid.Domain - if jid.Node != "" { - result = jid.Node + "@" + result +func (j JID) Node() string { + at := strings.Index(string(j), "@") + if at == -1 { + return "" } - if jid.Resource != "" { - result = result + "/" + jid.Resource - } - return result + return string(j[:at]) } -// Set implements flag.Value. -func (jid *JID) Set(val string) error { - r := regexp.MustCompile("^(([^@/]+)@)?([^@/]+)(/([^@/]+))?$") - parts := r.FindStringSubmatch(val) - if parts == nil { - return fmt.Errorf("%s doesn't match user@domain/resource", val) +func (j JID) Domain() string { + at := strings.Index(string(j), "@") + slash := strings.LastIndex(string(j), "/") + if slash == -1 { + slash = len(j) } - // jid.Node = stringprep.Nodeprep(parts[2]) - // jid.Domain = stringprep.Nodeprep(parts[3]) - // jid.Resource = stringprep.Resourceprep(parts[5]) - jid.Node = parts[2] - jid.Domain = parts[3] - jid.Resource = parts[5] - return nil + return string(j[at+1 : slash]) +} + +func (j JID) Resource() string { + slash := strings.LastIndex(string(j), "/") + if slash == -1 { + return "" + } + return string(j[slash+1:]) } func (s *stream) String() string {