use crate::{Category, Source};
pub struct CliSource<P> {
name: String,
partial: P,
}
impl<P> CliSource<P>
where
P: serde::Serialize + Send + Sync + 'static,
{
pub fn new(name: impl Into<String>, partial: P) -> Self {
Self {
name: name.into(),
partial,
}
}
}
impl<P> Source for CliSource<P>
where
P: serde::Serialize + Send + Sync + 'static,
{
fn name(&self) -> &str {
&self.name
}
fn category(&self) -> Category {
Category::Cli
}
fn deserialize(
&self,
seed: &mut dyn for<'de> FnMut(
&mut dyn erased_serde::Deserializer<'de>,
) -> Result<(), erased_serde::Error>,
) -> Result<(), erased_serde::Error> {
let bytes = serde_json::to_vec(&self.partial)
.map_err(<erased_serde::Error as serde::de::Error>::custom)?;
let mut json_de = serde_json::Deserializer::from_slice(&bytes);
let mut erased = <dyn erased_serde::Deserializer>::erase(&mut json_de);
seed(&mut erased)
}
}