use crate::ast::*; use crate::checker_state::{CheckerError, CheckerState}; use tracing::{debug, instrument}; impl Programme { pub fn check(&self) -> Result<(), CheckerError> { let mut state = CheckerState::default(); state.check(self) } } impl CheckerState { #[instrument(skip(self, prog), level = "debug")] pub fn check(&mut self, prog: &Programme) -> Result<(), CheckerError> { let Programme(decls) = prog; for decl in decls { debug!(%self, %decl); match decl { Decl::Set { name, set } => { let set = self.check_set(set)?; self.add_set(name, set) } Decl::Element { name, element, set } => { let set = self.check_set(set)?; let element = self.check_element(element, &set)?; self.add_element(name.clone(), element, set) } Decl::Signature { .. } => { return Err(CheckerError::Unimplemented("signatures".to_string())); } Decl::Instance { .. } => { return Err(CheckerError::Unimplemented("instances".to_string())); } }?; } debug!(%self); Ok(()) } }