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"
|
regex = "1.10"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
|
|
||||||
|
serde = { version = "1.0.196", features = ["derive"] }
|
||||||
serde_json = "1.0.113"
|
serde_json = "1.0.113"
|
||||||
strip-ansi-escapes = "0.2.0"
|
strip-ansi-escapes = "0.2.0"
|
||||||
|
|
||||||
|
|
@ -70,3 +71,7 @@ members = ["miette-derive"]
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
all-features = true
|
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