3

I want de-serialization to fail empty arrays. The following code works, but I want to make this specific case fail:

use serde::Deserialize;

#[derive(Debug)]
#[derive(Deserialize)]
struct Doc {
    nums: Vec<i32>
}

fn main(){
    let data = r#"
        {"nums": []}
    "#;
    let doc: Doc = serde_json::from_str(data).unwrap();
    dbg!(doc);
}

What options exist to achieve this?

Blank
  • 423
  • 1
  • 5
  • 16

1 Answers1

6

You could use a custom deserialize_with function

use serde::{de::Deserializer, de::Error, Deserialize};

#[derive(Debug, Deserialize)]
struct Doc {
    #[serde(deserialize_with = "non_empty")]
    nums: Vec<i32>,
}

fn non_empty<'de, D, T>(d: D) -> Result<Vec<T>, D::Error>
where
    D: Deserializer<'de>,
    T: Deserialize<'de>,
{
    let vec = <Vec<T>>::deserialize(d)?;
    if vec.is_empty() {
        Err(D::Error::custom("need non-empty"))
    } else {
        Ok(vec)
    }
}

fn main() {
    let data = r#"
        {"nums": []}
    "#;
    let doc: Doc = serde_json::from_str(data).unwrap();
    dbg!(doc);
}
Stargateur
  • 24,473
  • 8
  • 65
  • 91
Holloway
  • 6,412
  • 1
  • 26
  • 33