open-standards/smart-byte/smart-byte-rs/crates/smart-byte-activitypub/src/error.rs
Transaction Science fdc9cf6ab0 ingest wave C: 3 crates · op-statements + smart-byte-activitypub + eoc-observability
OpenPay (1 crate, ~2940 LOC, 40 tests)
  op-statements         Statement generation + reconciliation + fee accounting.
                        Render targets: PDF (template), CSV, JSON, 94-char
                        NACHA fixed-width. ISO 20022 camt.053 with full
                        BkToCstmrStmt envelope (GrpHdr/Stmt/Bal/Ntry). BAI2
                        with 01/02/03/16/49/98/99 records. MT940/MT942
                        SWIFT with :20:/:25:/:28C:/:60F:/:61:/:86:/:62F:
                        + :90C:/:90D: counters. FeeBucket (interchange/scheme/
                        acquirer/fx/settlement-network/bnpl) + FeeSchedule
                        with bps + flat rules. Cadence (daily/weekly/monthly/
                        custom). Two-tier Reconciler (external_id → window
                        heuristic).

Smart Byte (1 crate, 3032 LOC, 39 tests)
  smart-byte-activitypub ActivityPub W3C Rec (2018). AS2 vocab + Public
                         addressing; Actor (Person/Application/Group/
                         Organization/Service) with publicKey + shared-inbox;
                         Object (Note/Article/Image/Video/Tombstone) with
                         Mastodon extensions (sensitive, CW summary,
                         conversation, blurhash); 12 Activity types
                         (Create/Update/Delete/Follow/Accept/Reject/Announce/
                         Like/Undo/Move/Block/Flag) with side-effect rules;
                         OrderedCollection + Page; Webfinger (RFC 7033);
                         HTTP Signatures (cavage draft-12 + RFC 9421);
                         SHA-256 Digest; Ed25519 sign/verify.

EOC (1 crate, 2759 LOC, 20 tests)
  eoc-observability     OpenTelemetry-compatible tracing + metrics + logs.
                        W3C tracecontext + baggage. Span / SpanKind / Status.
                        Samplers: AlwaysOn/Off/RatioBased/ParentBased. Sync
                        BatchSpanProcessor + Exporter trait. Counter / Gauge /
                        Histogram. Prometheus text exposition (HELP/TYPE/
                        _bucket/_sum/_count/+Inf). StatsD / DogStatsD lines.
                        GenAI semconv (gen_ai.{operation,system,request.*,
                        response.*,usage.*}) + EOC extensions (eoc.joules.*,
                        eoc.co2e_grams, eoc.cost.usd). USD + gCO2e attribution
                        with PUE. LangSmith + LangFuse export adapters.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
2026-05-24 13:51:09 -04:00

58 lines
2 KiB
Rust

//! Typed errors for the ActivityPub adapter.
use thiserror::Error;
/// All ActivityPub-side errors collapse to a single typed enum so callers
/// can match on the kind without depending on intermediate crates.
#[derive(Debug, Error)]
pub enum ActivityPubError {
/// JSON encode / decode failed.
#[error("json error: {0}")]
Json(String),
/// Malformed actor URI / IRI.
#[error("invalid iri: {0}")]
InvalidIri(String),
/// Webfinger resource was malformed or did not match the requested acct.
#[error("webfinger error: {0}")]
Webfinger(String),
/// HTTP Signature could not be produced or verified.
#[error("http signature error: {0}")]
HttpSig(String),
/// A required `@context` term was missing from an incoming document.
#[error("invalid context: {0}")]
InvalidContext(String),
/// An Activity referenced an unknown or unsupported `type`.
#[error("unknown activity type: {0}")]
UnknownActivity(String),
/// An Activity violated a side-effect precondition (e.g. Undo with
/// a mismatched actor).
#[error("activity rejected: {0}")]
Rejected(String),
/// An object was not found in local storage.
#[error("not found: {0}")]
NotFound(String),
/// A cryptographic operation (key parse / sign / verify) failed.
#[error("crypto error: {0}")]
Crypto(String),
/// Vocabulary validation failed (missing required field, wrong type).
#[error("vocabulary error: {0}")]
Vocabulary(String),
/// Inbox / outbox delivery failed.
#[error("delivery error: {0}")]
Delivery(String),
}
impl From<serde_json::Error> for ActivityPubError {
fn from(e: serde_json::Error) -> Self {
ActivityPubError::Json(e.to_string())
}
}
impl From<url::ParseError> for ActivityPubError {
fn from(e: url::ParseError) -> Self {
ActivityPubError::InvalidIri(e.to_string())
}
}
/// Convenience result alias.
pub type Result<T> = core::result::Result<T, ActivityPubError>;