use super::*;
use nyar_error::{FileSpan, Validation};
mod display;
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StringTextNode {
pub text: String,
pub span: Range<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StringLiteralNode {
pub literal: StringTextNode,
pub handler: Option<IdentifierNode>,
}
impl ValkyrieNode for StringTextNode {
fn get_range(&self) -> Range<usize> {
Range { start: self.span.start as usize, end: self.span.end as usize }
}
}
impl ValkyrieNode for StringLiteralNode {
fn get_range(&self) -> Range<usize> {
match &self.handler {
Some(s) => Range { start: s.span.get_start(), end: self.literal.span.end as usize },
None => self.literal.get_range(),
}
}
}
impl StringTextNode {
pub fn new<S: ToString>(value: S, span: Range<u32>) -> Self {
Self { text: value.to_string(), span }
}
pub fn as_identifier(&self) -> IdentifierNode {
IdentifierNode { name: self.text.clone(), span: FileSpan::default().with_range(self.get_range()) }
}
}
impl StringLiteralNode {
pub fn as_raw(&self) -> StringTextNode {
self.literal.clone()
}
pub fn with_handler(self, handler: IdentifierNode) -> Self {
Self { handler: Some(handler), ..self }
}
}