use crate::diagnostic::Diagnostic; use crate::diagnostic_factories::symbol_already_declared; use crate::diagnostics_result; use crate::symbol::Symbol; use crate::symbol_table::SymbolTable; pub fn try_insert_symbol_into( symbol: Symbol, symbol_table: &mut SymbolTable, ) -> Result<(), Diagnostic> { let maybe_already_inserted = symbol_table.get_symbol(symbol.scope_id(), symbol.declared_name()); if let Some(already_inserted) = maybe_already_inserted { Err(symbol_already_declared(&already_inserted, &symbol)) } else { symbol_table.insert_symbol(symbol); Ok(()) } } pub fn try_insert_symbols_into( symbols: Vec, symbol_table: &mut SymbolTable, ) -> Result<(), Vec> { let diagnostics: Vec = symbols .into_iter() .map(|symbol| try_insert_symbol_into(symbol, symbol_table)) .filter_map(Result::err) .collect(); diagnostics_result!(diagnostics) }