1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
use super::rules::*; use super::terms::*; use serde::{Deserialize, Serialize}; use std::rc::Rc; use std::sync::Arc; #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub enum Node { Rule(Arc<Rule>), Term(Term), } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Trace { pub node: Node, pub children: Vec<Rc<Trace>>, } impl Trace { pub fn term(&self) -> Option<Term> { if let Node::Term(t) = &self.node { Some(t.clone()) } else { None } } } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct TraceResult { pub trace: Rc<Trace>, pub formatted: String, }