Repository navigation
Conversation
Releases v1.1.0 failed at "Check release version" because Cargo.toml was never bumped by hand. Rewrite the [package] version in Cargo.toml and Cargo.lock from the release tag before testing, packaging and publishing, matching the Node and Python SDK release flow.
…enerator src/generated/ is written by lettermint/sdk-generator (emit rust, next profile, spec 80d8ab2a2d). scripts/generate.sh regenerates it, or with --check verifies it; without the generator it checks the headers.
…d open types One Lettermint client replaces Lettermint::email/api, EmailClient and ApiClient. It takes a sending token and/or a team token (or one token classified by prefix); emails() uses the sending token, the Team API the team token, and ping/reschedule/cancel either. A missing token is a config error that names the option. - Types and the operation table come from the SDK generator (next profile): open #[non_exhaustive] enums with Other(String) that round-trip unknown values, required fields that are required, optional and nullable kept apart, CursorPage<T>, typed query structs. - Sending: an owned builder from emails().compose(), send(options) with a per-call idempotency key, validation of tags before every request, Attachment::from_bytes/from_base64, send_batch with options. - Team API: the Node 3.0 layout (projects().report_forwarding(), routes(), team().members(), webhooks().deliveries()), iterate() paginators that implement Stream. - Transport: redirects are never followed (Error::Redirect), a 30 s default timeout that covers the body, no null body on bodiless POSTs, path IDs encoded and "."/".." rejected, empty/HTML/invalid bodies as Error::UnexpectedResponse. - Errors: one Error enum with HTTP variants (Authentication through Server), status()/code(), Retry-After, Laravel field errors, tokens redacted from every error body including 422. - Debug output of the client, builders, sub-clients, HttpRequest and Webhook redacts tokens and secrets. - Webhooks: any v1 may match, the delivery header is required, typed reasons, http::HeaderMap and map headers, verify_at for replays. BREAKING CHANGE: the 1.x entry points, endpoint structs, OPERATION_IDS, Transport/HttpRequest shapes, error variants and many type names changed. See UPGRADE.md.
UPGRADE.md replaces MIGRATING.md and keeps its 0.3 to 1.0 section. It covers every changed call, the type rename table, the removed types and exports, and states that 1.x no longer receives updates.
Test Rust 1.98 (rust-version) on Linux next to stable on every OS, run scripts/generate.sh --check, and scan UPGRADE.md instead of MIGRATING.md.
The spec at lettermint/lettermint@0b4ecbdd23 (main, the #2582 merge) is identical to the previous pin; only the generated file headers change.
async_trait marks the boxed future #[must_use], which Clippy 1.99 reports as double_must_use. 1.x had the same scoped allow.
Bjornftw
approved these changes
Oct 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A new major version, following the Lettermint SDK design agreed for all languages. The reference is the Node.js SDK 3.0 (lettermint/lettermint-node#36). Sending holds no state on the client, types are generated from the published API spec, and every SDK passes the same conformance suite.
What changes
sendingTokenand/orteamToken. A single token string is detected by prefix:lm_team_is a team token,lm_plus letters and digits is a sending token, and anything else is a config error. Each part uses its own token and never falls back to the other.emails.send(message, options),emails.sendBatch(…)and an immutable per-messagecompose()builder. The idempotency key is a per-call option. Attachments are objects.0b4ecbdd23) using its names. Enums are open, so new API values never break decoding.verify(rawBody, headers)requires bothX-Lettermint-SignatureandX-Lettermint-Delivery, accepts any matchingv1, uses a ±300 s tolerance, and keys the HMAC on the secret as-is. Reason codes are the same in every SDK.Specific to this SDK
Cargo.tomlstill said1.0.0.Other(String),#[non_exhaustive]). In 1.x, a new status value turned a successful send into an error, so a retry sent the email twice.OPERATION_IDSis removed.none. There is a 30 s default timeout that covers the body.Debugis redacted on the client, requests and webhook. Webhooks accept anyv1.Verification
-D warnings, doc, audit andpublish --dry-runpass.--strict. crates.io 1.0.0 fails 15.Release
Publish a GitHub release
v2.0.0. It publishes to crates.io, the first release since 1.0.0.Docs for all SDK majors: lettermint/lettermint#2594 (stacked on lettermint/lettermint#2590). Merge it after the releases.
🤖 Generated with Claude Code