use crate::serde::path_buf_serde::PathBufVisitor;
use serde::{de::Visitor, Deserializer, Serializer};
use std::fmt;
use std::path::PathBuf;
pub fn serialize<S>(path: &Option<PathBuf>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match path {
Some(p) => serializer.serialize_str(p.to_string_lossy().as_ref()),
None => serializer.serialize_none(),
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<PathBuf>, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_option(OptionPathBufVisitor)
}
struct OptionPathBufVisitor;
impl<'de> Visitor<'de> for OptionPathBufVisitor {
type Value = Option<PathBuf>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a string representing a file path or null")
}
fn visit_none<E>(self) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(None)
}
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_str(PathBufVisitor).map(Some)
}
}