Reputation: 443
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?
Upvotes: 3
Views: 409
Reputation: 7367
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);
}
Upvotes: 6