From: Graham Miller Date: Fri, 5 Oct 2012 00:08:54 +0000 (+1000) Subject: net/mail: make address parsing (more) public X-Git-Tag: go1.1rc2~2254 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9f807fcc4ae1bdd38ee637a88128a1c72d984a30;p=gostls13.git net/mail: make address parsing (more) public Code for parsing email addresses was already partially part of the public API with "func (Header) AddressList". This CL adds a trivial implementation for two public methods to parse address and lists from a string. With tests. R=dsymonds CC=golang-dev https://golang.org/cl/5676067 --- diff --git a/src/pkg/net/mail/message.go b/src/pkg/net/mail/message.go index 93cc4d1edd..96c796e780 100644 --- a/src/pkg/net/mail/message.go +++ b/src/pkg/net/mail/message.go @@ -127,7 +127,7 @@ func (h Header) AddressList(key string) ([]*Address, error) { if hdr == "" { return nil, ErrHeaderNotPresent } - return newAddrParser(hdr).parseAddressList() + return ParseAddressList(hdr) } // Address represents a single mail address. @@ -138,6 +138,16 @@ type Address struct { Address string // user@domain } +// Parses a single RFC 5322 address, e.g. "Barry Gibbs " +func ParseAddress(address string) (*Address, error) { + return newAddrParser(address).parseAddress() +} + +// ParseAddressList parses the given string as a list of addresses. +func ParseAddressList(list string) ([]*Address, error) { + return newAddrParser(list).parseAddressList() +} + // String formats the address as a valid RFC 5322 address. // If the address's name contains non-ASCII characters // the name will be rendered according to RFC 2047. diff --git a/src/pkg/net/mail/message_test.go b/src/pkg/net/mail/message_test.go index fd17eb414a..2e746f4a72 100644 --- a/src/pkg/net/mail/message_test.go +++ b/src/pkg/net/mail/message_test.go @@ -227,13 +227,24 @@ func TestAddressParsing(t *testing.T) { }, } for _, test := range tests { - addrs, err := newAddrParser(test.addrsStr).parseAddressList() + if len(test.exp) == 1 { + addr, err := ParseAddress(test.addrsStr) + if err != nil { + t.Errorf("Failed parsing (single) %q: %v", test.addrsStr, err) + continue + } + if !reflect.DeepEqual([]*Address{addr}, test.exp) { + t.Errorf("Parse (single) of %q: got %+v, want %+v", test.addrsStr, addr, test.exp) + } + } + + addrs, err := ParseAddressList(test.addrsStr) if err != nil { - t.Errorf("Failed parsing %q: %v", test.addrsStr, err) + t.Errorf("Failed parsing (list) %q: %v", test.addrsStr, err) continue } if !reflect.DeepEqual(addrs, test.exp) { - t.Errorf("Parse of %q: got %+v, want %+v", test.addrsStr, addrs, test.exp) + t.Errorf("Parse (list) of %q: got %+v, want %+v", test.addrsStr, addrs, test.exp) } } }