Chromium Code Reviews| Index: service/mail/message.go |
| diff --git a/service/mail/message.go b/service/mail/message.go |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9407682ef00714f78c3e5fd8b05303734af911b8 |
| --- /dev/null |
| +++ b/service/mail/message.go |
| @@ -0,0 +1,130 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
|
martiniss
2015/12/16 21:54:15
Couple simple tests for this? Just to get some bas
iannucci
2015/12/17 00:01:07
oh, right, forgot I had code here.
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package mail |
| + |
| +import ( |
| + "fmt" |
| + net_mail "net/mail" |
| + "reflect" |
| + |
| + "google.golang.org/appengine/mail" |
| +) |
| + |
| +// Attachment is a mimic of https://godoc.org/google.golang.org/appengine/mail#Attachment |
| +// |
| +// It's provided here for convenience, and is compile-time checked to be |
| +// identical. |
| +type Attachment struct { |
| + // Name must be set to a valid file name. |
| + Name string |
| + Data []byte |
| + ContentID string |
| +} |
| + |
| +var _ Attachment = (Attachment)(mail.Attachment{}) |
| + |
| +// Message is a mimic of https://godoc.org/google.golang.org/appengine/mail#Message |
| +// |
| +// It's provided here for convenience, and is init-time checked to be identical. |
| +type Message struct { |
| + Sender string |
| + ReplyTo string |
| + To, Cc, Bcc []string |
| + Subject string |
| + Body string |
| + HTMLBody string |
| + Attachments []Attachment |
| + Headers net_mail.Header |
| +} |
| + |
| +func init() { |
| + mt := reflect.TypeOf(mail.Message{}) |
| + ot := reflect.TypeOf(Message{}) |
| + if mt.NumField() != ot.NumField() { |
| + panic(fmt.Errorf("mismatched number of fields %s v %s", mt, ot)) |
| + } |
| + |
| + for i := 0; i < mt.NumField(); i++ { |
| + mf := mt.Field(i) |
| + of := mt.Field(i) |
| + if mf.Name != of.Name { |
| + panic(fmt.Errorf("mismatched names %s v %s", mf.Name, of.Name)) |
| + } |
| + if mf.Name == "Attachments" { |
| + if !mf.Type.Elem().ConvertibleTo(of.Type.Elem()) { |
| + panic(fmt.Errorf("mismatched element type for Attachments %s v %s", |
| + mf.Type, of.Type)) |
| + } |
| + } else { |
| + if mf.Type != of.Type { |
| + panic(fmt.Errorf("mismatched type for field %s: %s v %s", mf.Name, mf.Type, of.Type)) |
| + } |
| + } |
| + } |
| +} |
| + |
| +func dupStrs(strs []string) []string { |
| + if len(strs) > 0 { |
| + ret := make([]string, len(strs)) |
| + copy(ret, strs) |
| + return ret |
| + } |
| + return nil |
| +} |
| + |
| +// ToSDKMessage returns a copy of this Message that's compatible with the native |
| +// SDK's Message type. |
| +func (m *Message) ToSDKMessage() *mail.Message { |
| + if m == nil { |
| + return nil |
| + } |
| + |
| + m = m.Copy() |
| + |
| + ret := &mail.Message{ |
| + Sender: m.Sender, |
| + ReplyTo: m.ReplyTo, |
| + Subject: m.Subject, |
| + Body: m.Body, |
| + HTMLBody: m.HTMLBody, |
| + To: m.To, |
| + Cc: m.Cc, |
| + Bcc: m.Bcc, |
| + Headers: m.Headers, |
| + } |
| + |
| + ret.Attachments = make([]mail.Attachment, len(m.Attachments)) |
| + for i := range m.Attachments { |
| + ret.Attachments[i] = (mail.Attachment)(m.Attachments[i]) |
| + } |
| + return ret |
| +} |
| + |
| +// Copy returns a duplicate Message |
| +func (m *Message) Copy() *Message { |
| + if m == nil { |
| + return nil |
| + } |
| + |
| + ret := *m |
| + |
| + ret.To = dupStrs(m.To) |
| + ret.Cc = dupStrs(m.Cc) |
| + ret.Bcc = dupStrs(m.Bcc) |
| + |
| + if len(m.Headers) > 0 { |
| + ret.Headers = make(net_mail.Header, len(m.Headers)) |
| + for k, vals := range m.Headers { |
| + ret.Headers[k] = dupStrs(vals) |
| + } |
| + } |
| + |
| + if len(m.Attachments) > 0 { |
| + ret.Attachments = make([]Attachment, len(m.Attachments)) |
| + copy(ret.Attachments, m.Attachments) |
| + } |
| + |
| + return &ret |
| +} |