Skip to content

Commit

Permalink
docs(examples): add serde_json integration example (#407)
Browse files Browse the repository at this point in the history
  • Loading branch information
Schniz authored Nov 13, 2024
1 parent 5f441d0 commit 2902a23
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ syn = { version = "2.0.48", features = ["full"] }
regex = "1.10"
lazy_static = "1.4"

serde = { version = "1.0.196", features = ["derive"] }
serde_json = "1.0.113"
strip-ansi-escapes = "0.2.0"

Expand Down Expand Up @@ -70,3 +71,7 @@ members = ["miette-derive"]

[package.metadata.docs.rs]
all-features = true

[[example]]
name = "serde_json"
required-features = ["fancy"]
48 changes: 48 additions & 0 deletions examples/serde_json.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//! This example shows how to integrate miette with serde_json
//! so the decoding source will be annotated with the decoding error,
//! providing contextual information about the error.

use miette::{IntoDiagnostic, SourceOffset};
use serde_json::{self, json};

#[derive(Debug, serde::Deserialize)]
struct Library {
#[allow(unused)]
name: String,
}

#[derive(Debug, thiserror::Error, miette::Diagnostic)]
#[error("malformed json provided")]
struct SerdeError {
cause: serde_json::Error,
#[source_code]
input: String,
#[label("{cause}")]
location: SourceOffset,
}

impl SerdeError {
/// Takes the input and the `serde_json::Error` and returns a SerdeError
/// that can be rendered nicely with miette.
pub fn from_serde_error(input: impl Into<String>, cause: serde_json::Error) -> Self {
let input = input.into();
let location = SourceOffset::from_location(&input, cause.line(), cause.column());
Self {
cause,
input,
location,
}
}
}

fn main() -> miette::Result<()> {
let input = serde_json::to_string_pretty(&json!({
"name": 123
}))
.into_diagnostic()?;

let _library: Library =
serde_json::from_str(&input).map_err(|cause| SerdeError::from_serde_error(input, cause))?;

Ok(())
}

0 comments on commit 2902a23

Please sign in to comment.