Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Unified Diff: service/mail/message.go

Issue 1525923002: Implement Mail service. (Closed) Base URL: https://github.com/luci/gae.git@filter_user
Patch Set: tests and words Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « service/mail/interface.go ('k') | service/mail/message_test.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: service/mail/message.go
diff --git a/service/mail/message.go b/service/mail/message.go
new file mode 100644
index 0000000000000000000000000000000000000000..95f844a1f396c453893cef6726740b19f48e69a8
--- /dev/null
+++ b/service/mail/message.go
@@ -0,0 +1,132 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// 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
+// (not statically because []Attachement prevents static casting).
+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. It only needs to be used by implementations (like
+// "impl/prod") which need an SDK compatible object
+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
+}
« no previous file with comments | « service/mail/interface.go ('k') | service/mail/message_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698