pub mod uri {
use crate::Uri;
use serde::{de, ser, Deserialize, Serialize};
pub fn deserialize<'de, D>(deserializer: D) -> Result<Uri, D::Error>
where
D: de::Deserializer<'de>,
{
String::deserialize(deserializer)?
.parse()
.map_err(de::Error::custom)
}
pub fn serialize<S>(uri: &Uri, serializer: S) -> Result<S::Ok, S::Error>
where
S: ser::Serializer,
{
uri.to_string().serialize(serializer)
}
}
pub mod uri_optional {
use crate::Uri;
use serde::{de, ser, Deserialize};
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Uri>, D::Error>
where
D: de::Deserializer<'de>,
{
Option::<String>::deserialize(deserializer)?
.map(|uri| uri.parse().map_err(de::Error::custom))
.transpose()
}
pub fn serialize<S>(maybe_uri: &Option<Uri>, serializer: S) -> Result<S::Ok, S::Error>
where
S: ser::Serializer,
{
match maybe_uri {
Some(uri) => serializer.serialize_some(&uri.to_string()),
None => serializer.serialize_none(),
}
}
}