reliar_core/lib.rs
1//! `reliar-core` is the pure envelope/message model every Reliar crate builds on: identity
2//! newtypes, the [`Message`] contract, a validated [`Headers`] map, typed [`Metadata`], and the
3//! [`Envelope`]/[`SerializedEnvelope`] pair that carries them (SRS §9–§17).
4//!
5//! # Guarantees
6//!
7//! - **Pure.** No storage or transport dependency: no sqlx, no broker client, no routing
8//! concept (a Kafka partition key, a `RabbitMQ` exchange, a NATS subject). Every other Reliar
9//! crate depends on this one; this one depends on nothing Reliar-specific (ADR 0002).
10//! - **One source of truth for framework metadata.** [`Envelope::metadata`] is canonical for
11//! every concept Reliar understands. A value here is never duplicated into
12//! [`Envelope::headers`], and Reliar never reads a framework value back out of headers
13//! (ADR 0004). [`Headers`] reserves the entire `reliar-` prefix, case-insensitively, so a
14//! custom header can never collide with — or be mistaken for — a framework one.
15//! - **Message identity never depends on `std::any::type_name::<T>()` or a module path.** A
16//! [`Message`]'s [`MessageType`] comes from its own `TYPE`/`VERSION` constants, so renaming or
17//! moving the Rust type is safe and two distinct types sharing them render identically
18//! (ADR 0010).
19//! - **One envelope type for both sides of a serialization boundary.** [`Envelope<T>`] and
20//! [`SerializedEnvelope`] (`= Envelope<bytes::Bytes>`) are the same generic type; converting
21//! between them ([`Envelope::map_body`]) can never drop or duplicate a field (ADR 0003).
22//!
23//! Every public error is a hand-rolled, `#[non_exhaustive]` enum with a wired
24//! [`std::error::Error::source`] — no `thiserror`, no `anyhow`. `Debug` on payload-bearing types
25//! elides the bytes; no `Display` here ever prints a payload, a header value, or a credential.
26
27#![forbid(unsafe_code)]
28#![warn(missing_docs)]
29
30mod content_type;
31mod envelope;
32mod headers;
33mod ids;
34mod mapper;
35mod message;
36mod metadata;
37mod serializer;
38
39pub use content_type::{ContentType, ContentTypeError};
40pub use envelope::{Envelope, EnvelopeBuilder, SerializedEnvelope};
41pub use headers::{HeaderError, Headers};
42pub use ids::{ConversationId, CorrelationId, IdError, MessageId, RequestId};
43pub use mapper::EnvelopeMapper;
44pub use message::{Message, MessageType};
45pub use metadata::{
46 CorrelationMetadata, DeliveryMetadata, EndpointAddress, Metadata, RoutingMetadata, TraceContext,
47};
48pub use serializer::Serializer;
49
50#[cfg(feature = "json")]
51pub use serializer::{JsonError, JsonSerializer};