grit_pattern_matcher/pattern/
variable_content.rsuse grit_util::error::{GritPatternError, GritResult};
use super::{resolved_pattern::ResolvedPattern, state::State, variable::Variable};
use crate::{context::QueryContext, pattern::patterns::Pattern};
use std::borrow::Cow;
#[derive(Debug, Clone)]
pub struct VariableContent<'a, Q: QueryContext> {
pub name: String,
pub pattern: Option<&'a Pattern<Q>>,
pub value: Option<Q::ResolvedPattern<'a>>,
pub value_history: Vec<Q::ResolvedPattern<'a>>,
pub mirrors: Vec<&'a Variable>,
}
impl<'a, Q: QueryContext> VariableContent<'a, Q> {
pub fn new(name: String) -> Self {
Self {
name,
pattern: None,
value: None,
value_history: vec![],
mirrors: vec![],
}
}
pub fn text(
&self,
state: &State<'a, Q>,
language: &Q::Language<'a>,
) -> GritResult<Cow<'a, str>> {
if let Some(value) = &self.value {
value.text(&state.files, language)
} else {
Err(GritPatternError::new(format!(
"no value for variable {}",
self.name
)))
}
}
pub(crate) fn set_value(&mut self, value: Q::ResolvedPattern<'a>) {
self.value = Some(value);
}
}