use std::hash::{Hash, Hasher};
use crate::common::{Location, Position};
use crate::parser::{HsmlResult, Span};
use super::process::process_class;
#[derive(Debug, Eq, serde::Serialize)]
pub struct ClassNode {
pub name: String,
pub location: Location,
}
impl PartialEq for ClassNode {
fn eq(&self, other: &Self) -> bool {
self.name == other.name
}
}
impl Hash for ClassNode {
fn hash<H: Hasher>(&self, state: &mut H) {
self.name.hash(state);
}
}
impl ClassNode {
#[doc(hidden)]
pub fn new_without_location(name: impl Into<String>) -> Self {
let zero = Position { line: 0, column: 0 };
Self {
name: name.into(),
location: Location {
start: zero,
end: zero,
},
}
}
}
pub fn class_node(input: Span<'_>) -> HsmlResult<'_, ClassNode> {
let (rest, class_name) = process_class(input)?;
Ok((
rest,
ClassNode {
name: class_name.to_string(),
location: Location::from_spans(&input, &rest),
},
))
}