use crate::ast::*; use crate::check_state::{CheckError, CheckState}; use tracing::{debug, instrument}; impl Programme { pub fn check(&self) -> Result<(), CheckError> { let mut state = CheckState::default(); state.check(self) } } impl CheckState { #[instrument(skip(self, prog), level = "debug")] pub fn check(&mut self, prog: &Programme) -> Result<(), CheckError> { let Programme(decls) = prog; for decl in decls { debug!(%self); debug!(%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, element, set) } Decl::Signature { .. } => { return Err(CheckError::Unimplemented("signatures".to_string())); } Decl::Instance { .. } => { return Err(CheckError::Unimplemented("instances".to_string())); } }?; } debug!(%self, "END"); Ok(()) } }