mirror of https://github.com/zkat/miette.git
docs(examples): add serde_json integration example (#407)
This commit is contained in:
parent
5f441d0115
commit
2902a2337c
|
|
@ -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"
|
||||
|
||||
|
|
@ -70,3 +71,7 @@ members = ["miette-derive"]
|
|||
|
||||
[package.metadata.docs.rs]
|
||||
all-features = true
|
||||
|
||||
[[example]]
|
||||
name = "serde_json"
|
||||
required-features = ["fancy"]
|
||||
|
|
|
|||
|
|
@ -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(())
|
||||
}
|
||||
Loading…
Reference in New Issue