evalphobia/aws-sdk-go-wrapper

View on GitHub
pinpointemail/type.go

Summary

Maintainability
A
0 mins
Test Coverage
package pinpointemail

import (
    SDK "github.com/aws/aws-sdk-go/service/pinpointemail"

    "github.com/evalphobia/aws-sdk-go-wrapper/private/pointers"
)

const (
    defaultCharset = "UTF-8"
)

type EmailInput struct {
    From    string
    ReplyTo []string

    // destination
    To  []string
    Cc  []string
    Bcc []string

    // message
    Content Content

    // email address for bounce
    FeedbackForwardingEmail string

    ConfigurationSetName string
    Tags                 []Tag
}

func (in EmailInput) ToInput() *SDK.SendEmailInput {
    input := &SDK.SendEmailInput{
        Content:          in.Content.ToContent(),
        ReplyToAddresses: toSlicePointer(in.ReplyTo),
        EmailTags:        toTags(in.Tags),
    }

    if in.From != "" {
        input.FromEmailAddress = pointers.String(in.From)
    }

    switch {
    case len(in.To) != 0,
        len(in.Cc) != 0,
        len(in.Bcc) != 0:
        input.Destination = &SDK.Destination{
            ToAddresses:  toSlicePointer(in.To),
            CcAddresses:  toSlicePointer(in.Cc),
            BccAddresses: toSlicePointer(in.Bcc),
        }
    }

    if in.FeedbackForwardingEmail != "" {
        input.FeedbackForwardingEmailAddress = pointers.String(in.FeedbackForwardingEmail)
    }
    if in.ConfigurationSetName != "" {
        input.ConfigurationSetName = pointers.String(in.ConfigurationSetName)
    }

    return input
}

// Content has the entire content of the email.
type Content struct {
    // If use RawMessage, below fields are ignored.
    // see criteria: https://github.com/aws/aws-sdk-go/blob/master/service/pinpointemail/api.go#L5877
    RawMessage []byte

    // Simple messages
    SubjectCharset string
    Subject        string
    BodyCharset    string
    Body           string
    HTML           bool
}

func (c Content) ToContent() *SDK.EmailContent {
    ec := &SDK.EmailContent{}
    if len(c.RawMessage) != 0 {
        // Use raw message
        ec.Raw = &SDK.RawMessage{
            Data: c.RawMessage,
        }
        return ec
    }

    // Use simple message
    if c.SubjectCharset == "" {
        c.SubjectCharset = defaultCharset
    }
    if c.BodyCharset == "" {
        c.BodyCharset = defaultCharset
    }

    content := &SDK.Content{
        Charset: pointers.String(c.BodyCharset),
        Data:    pointers.String(c.Body),
    }
    body := &SDK.Body{}
    switch {
    case c.HTML:
        body.Html = content
    default:
        body.Text = content
    }

    ec.Simple = &SDK.Message{
        Subject: &SDK.Content{
            Charset: pointers.String(c.SubjectCharset),
            Data:    pointers.String(c.Subject),
        },
        Body: body,
    }
    return ec
}

type Tag struct {
    Name  string
    Value string
}

func (t Tag) ToTag() *SDK.MessageTag {
    return &SDK.MessageTag{
        Name:  pointers.String(t.Name),
        Value: pointers.String(t.Value),
    }
}

func toTags(list []Tag) []*SDK.MessageTag {
    if len(list) == 0 {
        return nil
    }

    result := make([]*SDK.MessageTag, len(list))
    for i, tag := range list {
        result[i] = tag.ToTag()
    }
    return result
}

func toSlicePointer(list []string) []*string {
    if len(list) == 0 {
        return nil
    }

    result := make([]*string, len(list))
    for i, v := range list {
        result[i] = pointers.String(v)
    }
    return result
}