use serde::{Deserialize, Deserializer, Serialize}; use std::{convert::Infallible, path::PathBuf, str::FromStr}; #[derive(Debug, PartialEq, Eq, Clone, Default, Serialize)] pub struct SearchPath { pub path: PathBuf, pub hidden: bool, pub recurse: Option, } impl From for SearchPath { fn from(path: PathBuf) -> Self { Self { path, ..Default::default() } } } impl FromStr for SearchPath { type Err = Infallible; fn from_str(s: &str) -> Result { s.parse().map(PathBuf::into) } } impl<'de> Deserialize<'de> for SearchPath { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { #[derive(Deserialize)] #[serde(untagged)] enum Variants { String(String), Struct { path: PathBuf, #[serde(default)] hidden: bool, #[serde(default)] recurse: Option, }, } match Variants::deserialize(deserializer)? { Variants::String(s) => s.parse().map_err(serde::de::Error::custom), Variants::Struct { path, hidden, recurse, } => Ok(Self { path, hidden, recurse, }), } } }