use std::str::FromStr;
use anyhow::Result;
use serde::{Deserialize, Deserializer};
pub trait AsQuery {
fn as_query(&self) -> Result<Option<String>>;
}
impl AsQuery for () {
fn as_query(&self) -> Result<Option<String>> {
Ok(None)
}
}
pub(crate) fn empty_string_as_none<'de, D, T>(de: D) -> Result<Option<T>, D::Error>
where
D: Deserializer<'de>,
T: FromStr,
T::Err: std::fmt::Display,
{
let opt = Option::<String>::deserialize(de)?;
match opt.as_deref() {
None | Some("") => Ok(None),
Some(s) => FromStr::from_str(s)
.map_err(serde::de::Error::custom)
.map(Some),
}
}