moq_json/lib.rs
1//! JSON publishing over [`moq-net`](moq_net) tracks, in two modes:
2//!
3//! - [`snapshot`]: **lossy**. One JSON value updated over time; a consumer only gets the most
4//! recent value. Intermediate updates are collapsed and older groups are dropped.
5//! - [`stream`]: **lossless**. An ordered append-log of self-contained records; every record is
6//! preserved and delivered in order, nothing is ever superseded.
7//!
8//! Pick [`snapshot`] when consumers care about "what is the value now" (a catalog, a status
9//! document) and [`stream`] when they care about every record (an event log, a media timeline).
10
11mod diff;
12pub mod snapshot;
13pub mod stream;
14
15pub use crate::diff::{Diff, diff};
16
17/// Errors produced while publishing or consuming JSON.
18#[derive(thiserror::Error, Debug, Clone)]
19#[non_exhaustive]
20pub enum Error {
21 /// An error from the underlying track.
22 #[error(transparent)]
23 Net(#[from] moq_net::Error),
24
25 /// A value failed to serialize, deserialize, or apply as a merge patch.
26 ///
27 /// Stored as a string since [`serde_json::Error`] is not [`Clone`].
28 #[error("json: {0}")]
29 Json(String),
30
31 /// A compressed frame could not be decoded (malformed, truncated, or oversized).
32 #[error(transparent)]
33 Flate(#[from] moq_flate::Error),
34}
35
36impl From<serde_json::Error> for Error {
37 fn from(err: serde_json::Error) -> Self {
38 Error::Json(err.to_string())
39 }
40}
41
42/// A [`Result`](std::result::Result) using this crate's [`Error`].
43pub type Result<T> = std::result::Result<T, Error>;