use napi_derive::napi;
use serde::Serialize;
#[napi(object)]
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize)]
pub struct Attributes {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub classes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attributes: Option<Vec<(String, String)>>,
}
impl Attributes {
pub fn to_html_attr_string(&self) -> String {
let mut parts = Vec::new();
if let Some(ref id) = self.id {
parts.push(format!("id=\"{}\"", escape_attr(id)));
}
if let Some(ref classes) = self.classes {
parts.push(format!("class=\"{}\"", escape_attr(&classes.join(" "))));
}
if let Some(ref attrs) = self.attributes {
for (k, v) in attrs {
parts.push(format!("{}=\"{}\"", escape_attr(k), escape_attr(v)));
}
}
parts.join(" ")
}
}
fn escape_attr(s: &str) -> String {
s.replace('&', "&")
.replace('"', """)
.replace('<', "<")
.replace('>', ">")
}