serdev 0.1.0

SerdeV - Serde with Validation
Documentation
  • Just a wrapper of serde_derive and 100% compatible
  • Validation on deserializing with #[serde(validate = "...")]

Example

[dependencies]
serdev     = "0.1"
serde_json = "1.0"
use serdev::Deserialize;

#[derive(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 < 0 || self.y < 0 {
            return Err("x and y must not be negative")
        }
        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" : 2 }
    "#).unwrap_err();

    // Prints error = x and y must not be negative
    println!("error = {error}");
}

Attribute

  • #[serde(validate = "function")]

    Perform validation by the function just after deserializing finished. The function must be callable as fn(&self) -> Result<(), impl Display>.
    Currently, errors are converted to String internally and passed to serde::de::Error::custom.

  • #[serde(validate(by = "function", error = "Type"))]

    Use 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::utils::validate".

License

Licensed under MIT LICENSE ( LICENSE or https://opensource.org/licenses/MIT ).