use std::fmt;
use std::fmt::Display;
#[derive(Debug, Default, Clone)]
pub struct CssSelectorPart {
components: Vec<String>,
}
impl CssSelectorPart {
pub fn new() -> Self {
Self::default()
}
pub fn class<T: ToString>(mut self, class: T) -> Self {
self.add_class(class);
self
}
pub fn add_class<T: ToString>(&mut self, class: T) {
self.components.push(format!(".{}", class.to_string()));
}
pub fn element<T: ToString>(mut self, element: T) -> Self {
self.add_element(element);
self
}
pub fn add_element<T: ToString>(&mut self, element: T) {
self.components.push(element.to_string());
}
}
impl Display for CssSelectorPart {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.components.to_vec().join(" "))
}
}
impl From<&str> for CssSelectorPart {
fn from(value: &str) -> Self {
Self {
components: vec![value.to_string()],
}
}
}
impl From<&[&str]> for CssSelectorPart {
fn from(value: &[&str]) -> Self {
Self {
components: value.iter().map(|part| part.to_string()).collect(),
}
}
}
#[derive(Default, Debug, Clone)]
pub struct CssSelector {
parts: Vec<CssSelectorPart>,
}
impl CssSelector {
pub fn new() -> Self {
Self::default()
}
pub fn part(mut self, part: CssSelectorPart) -> Self {
self.add_part(part);
self
}
pub fn add_part(&mut self, part: CssSelectorPart) {
self.parts.push(part);
}
pub fn class<T: ToString>(mut self, class: T) -> Self {
self.add_class(class);
self
}
pub fn add_class<T: ToString>(&mut self, class: T) {
self.parts.push(CssSelectorPart::new().class(class));
}
pub fn element<T: ToString>(mut self, element: T) -> Self {
self.add_element(element);
self
}
pub fn add_element<T: ToString>(&mut self, element: T) {
self.parts.push(CssSelectorPart::new().element(element));
}
}
impl Display for CssSelector {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.parts.iter().map(|part| part.to_string()).collect::<Vec<String>>().join(", "))
}
}
impl From<&str> for CssSelector {
fn from(value: &str) -> Self {
Self {
parts: vec![CssSelectorPart::from(value)],
}
}
}
impl From<&[&str]> for CssSelector {
fn from(value: &[&str]) -> Self {
Self {
parts: value.iter().map(|p| CssSelectorPart::from(*p)).collect(),
}
}
}
impl From<CssSelectorPart> for CssSelector {
fn from(value: CssSelectorPart) -> Self {
Self { parts: vec![value] }
}
}
impl From<&[CssSelectorPart]> for CssSelector {
fn from(value: &[CssSelectorPart]) -> Self {
Self { parts: value.to_vec() }
}
}