# Changelog
All notable changes to `floopfloop` (Rust SDK) are documented in this file.
Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
This crate follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.1.0-alpha.2] — 2026-04-25
### Added
- `FloopError::new(code, status, message)` is now `pub` (was `pub(crate)`).
Callers can construct sentinel errors to short-circuit
`projects().stream()` handlers — return `Err(FloopError::new(...))` from
the closure to stop polling early without the previous `Cell<T>`
workaround the cookbook had to recommend.
- `FloopError::with_request_id(id)` and `FloopError::with_retry_after(d)`
builder-style setters for fully populating an externally-constructed
`FloopError` (e.g. when forwarding upstream-service errors).
- `docs/recipes.md` cookbook — six end-to-end Rust recipes that mirror
the same set of patterns shipped in the Node, Python, Go, Ruby, and
PHP SDKs.
### Changed
- Cookbook recipe 2 ("Watch a build progress in real time") now uses
the supported `Err(FloopError::new(...))` pattern for early-abort
instead of the `Cell<bool>` shared-state workaround that was needed
while `new` was crate-private.
## [0.1.0-alpha.1] — 2026-04-24
### Added
- `floopfloop::Client` with bearer auth, a builder-style configuration
(`base_url`, `timeout`, `user_agent_suffix`, `http_client`) and full
`Arc`-based `Clone` so one instance can be shared across tasks.
- `FloopError` + `FloopErrorCode` — 13 named variants plus an
`Other(String)` catch-all for server codes the SDK doesn't yet
recognise. `retry_after: Option<Duration>` parses both delta-seconds
and RFC 7231 HTTP-date `Retry-After` headers, matching the
Node / Python / Go SDKs.
- Eight resources, method-for-method parity with every other FloopFloop SDK:
- `projects`: `create`, `list`, `get`, `status`, `cancel`, `reactivate`,
`refine`, `conversations`, `stream`, `wait_for_live`.
- `subdomains`: `check`, `suggest`.
- `secrets`: `list`, `set`, `remove`.
- `library`: `list` (tolerates both bare-array and `{items:[]}`
response shapes), `clone_project`.
- `usage`: `summary`.
- `api_keys`: `list`, `create`, `remove` (accepts id **or** name and
resolves via a preflight list).
- `uploads`: `create` (presign + direct S3 PUT; 5 MB cap; extension
allowlist matches Node / Python / Go).
- `user`: `me`.
- `Projects::stream` is a callback-based polling iterator that
de-duplicates identical consecutive snapshots (`status / step /
progress / queue_position`) — same event sequence the Node and
Python SDKs yield. `Projects::wait_for_live` is a thin wrapper that
invokes `stream` with a no-op handler and returns the hydrated
`Project` on success.
- `rustls`-only TLS stack by default (no OpenSSL / native-TLS needed on
any platform). Override by passing a custom `reqwest::Client` via
`builder.http_client(...)`.
- 25 tests pass: 5 unit (error formatting, retry-after parsing, mime
guesses), 18 integration via `wiremock`, 2 doc-tests.