use serde::{Deserialize, Deserializer, Serialize};
use crate::TrustedHtml;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize)]
#[serde(transparent)]
pub struct Sanitised(String);
impl Sanitised {
#[must_use]
pub fn new(untrusted: &str) -> Self {
Sanitised(ammonia::clean(untrusted))
}
#[must_use]
pub fn with(policy: &ammonia::Builder<'_>, untrusted: &str) -> Self {
Sanitised(policy.clean(untrusted).to_string())
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
#[must_use]
pub fn into_string(self) -> String {
self.0
}
}
impl TrustedHtml for Sanitised {
fn trusted_html(&self) -> &str {
&self.0
}
}
impl<'de> Deserialize<'de> for Sanitised {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let untrusted = String::deserialize(deserializer)?;
Ok(Sanitised::new(&untrusted))
}
}
#[cfg(test)]
mod tests;