Go SDK

The norq-go package provides a Go client for sending and linting notification templates.

Install

go get github.com/norq/norq-go

Requires the norq binary to be installed and available in $PATH (or configured explicitly).

Quick start

package main
 
import (
    "context"
    "fmt"
    "github.com/norq/norq-go"
)
 
func main() {
    client, err := norq.New()
    if err != nil {
        panic(err)
    }
 
    ctx := context.Background()
 
    // Send
    result, err := client.Send(ctx, "transactional/order-shipped", norq.SendOpts{
        To:   &norq.Recipient{Email: "gaurav@example.com"},
        Data: map[string]any{"user": map[string]any{"first_name": "Gaurav"}},
    })
 
    for _, r := range result.Results {
        fmt.Printf("%s: success=%v\n", r.Channel, r.Success)
    }
}

Constructor options

client, _ := norq.New(
    norq.WithBinaryPath("/usr/local/bin/norq"),
    norq.WithCwd("/path/to/project"),
    norq.WithResolver(myResolver),
)

API

Send(ctx, id, opts)

result, err := client.Send(ctx, "transactional/welcome", norq.SendOpts{
    To:       &norq.Recipient{Email: "user@example.com"},
    Data:     map[string]any{...},
    Sample:   "New user",          // alternative to Data
    Channels: []string{"email"},   // optional filter
    DryRun:   false,
})

Lint(ctx, id)

results, err := client.Lint(ctx, "")        // all
results, err := client.Lint(ctx, "transactional/welcome") // one
 
for _, r := range results {
    for _, d := range r.Diagnostics {
        fmt.Printf("%s: %s [%s]\n", d.Severity, d.Message, d.Rule)
    }
}

RecipientResolver

type MyResolver struct {
    db *sql.DB
}
 
func (r *MyResolver) Resolve(ctx context.Context, userID string) (*norq.Recipient, error) {
    user, err := r.db.GetUser(ctx, userID)
    if err != nil {
        return nil, err
    }
    return &norq.Recipient{Email: user.Email, Phone: user.Phone}, nil
}
 
client, _ := norq.New(norq.WithResolver(&MyResolver{db: db}))

Types

type Recipient struct {
    Email    string
    Phone    string
    Slack    *SlackRecipient
    Push     *PushRecipient
    WhatsApp *WhatsAppRecipient
    MsTeams  *MsTeamsRecipient
}
 
type SendResult struct {
    Success   bool
    Provider  string
    Channel   string
    MessageID string
    Error     string
}
 
type SendMultiResult struct {
    Results []SendResult
    Skipped []SkippedChannel
}

Codegen

norq codegen --lang go --out internal/norq/types.go

Generates typed Go structs for each notification's data shape.