| Crates.io | serdev |
| lib.rs | serdev |
| version | 0.2.0 |
| created_at | 2024-08-25 01:32:24.128765+00 |
| updated_at | 2024-09-13 22:15:43.141021+00 |
| description | SerdeV - Serde with Validation |
| homepage | https://crates.io/crates/serdev |
| repository | https://github.com/ohkami-rs/serdev |
| max_upload_size | |
| id | 1350697 |
| size | 7,038 |
#[serde(validate = "...")][dependencies]
serdev = "0.2"
serde_json = "1.0"
use serdev::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug)]
#[serde(validate = "Self::validate")]
struct Point {
x: i32,
y: i32,
}
impl Point {
fn validate(&self) -> Result<(), impl std::fmt::Display> {
if self.x * self.y > 100 {
return Err("x * y must not exceed 100")
}
Ok(())
}
}
fn main() {
let point = serde_json::from_str::<Point>(r#"
{ "x" : 1, "y" : 2 }
"#).unwrap();
// Prints point = Point { x: 1, y: 2 }
println!("point = {point:?}");
let error = serde_json::from_str::<Point>(r#"
{ "x" : 10, "y" : 20 }
"#).unwrap_err();
// Prints error = x * y must not exceed 100
println!("error = {error}");
}
Of course, you can use it in combination with some validation tools like validator! ( full example )
#[serde(validate = "function")]
Automatically validate by the function in deserialization. The function must be callable as fn(&self) -> Result<(), impl Display>.
Errors are converted to a String internally and passed to serde::de::Error::custom.
#[serde(validate(by = "function", error = "Type"))]
Using given Type for validation error without internal conversion. The function must explicitly return Result<(), Type>.
This may be preferred when you need better performance even in error cases.
For no-std use, this is the only way supported.
Both "function" and "Type" accept path like "crate::util::validate".
Additionally, #[serdev(crate = "path::to::serdev")] is supported for reexport from another crate.
Licensed under MIT LICENSE ( LICENSE or https://opensource.org/licenses/MIT ).