generalbots/src/basic/keywords/errors/mod.rs
Rodrigo Rodriguez (Pragmatismo) 16cf467bca Add documentation and core BASIC language functions
- Add SET_SCHEDULE.md and TEMPLATE_VARIABLES.md documentation
- Implement array functions (CONTAINS, PUSH/POP, SLICE, SORT, UNIQUE)
- Implement math functions module structure
- Implement datetime functions module structure
- Implement validation functions (ISNULL, ISEMPTY, VAL, STR, TYPEOF)
- Implement error handling functions (THROW, ERROR, ASSERT)
- Add CRM lead scoring keywords (SCORE_LEAD, AI_SCORE_LEAD)
- Add messaging keywords (SEND_TEMPLATE, CREATE_TEMPLATE)
2025-11-30 11:09:16 -03:00

194 lines
5.7 KiB
Rust

pub mod throw;
use crate::shared::models::UserSession;
use crate::shared::state::AppState;
use log::debug;
use rhai::{Dynamic, Engine, EvalAltResult, Map, Position};
use std::sync::Arc;
pub fn register_error_functions(state: Arc<AppState>, user: UserSession, engine: &mut Engine) {
throw_keyword(&state, user.clone(), engine);
error_keyword(&state, user.clone(), engine);
is_error_keyword(&state, user.clone(), engine);
assert_keyword(&state, user.clone(), engine);
log_error_keyword(&state, user, engine);
debug!("Registered all error handling functions");
}
pub fn throw_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
engine.register_fn(
"THROW",
|message: &str| -> Result<Dynamic, Box<EvalAltResult>> {
Err(Box::new(EvalAltResult::ErrorRuntime(
message.into(),
Position::NONE,
)))
},
);
engine.register_fn(
"throw",
|message: &str| -> Result<Dynamic, Box<EvalAltResult>> {
Err(Box::new(EvalAltResult::ErrorRuntime(
message.into(),
Position::NONE,
)))
},
);
engine.register_fn(
"RAISE",
|message: &str| -> Result<Dynamic, Box<EvalAltResult>> {
Err(Box::new(EvalAltResult::ErrorRuntime(
message.into(),
Position::NONE,
)))
},
);
debug!("Registered THROW keyword");
}
pub fn error_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
engine.register_fn("ERROR", |message: &str| -> Map {
let mut map = Map::new();
map.insert("error".into(), Dynamic::from(true));
map.insert("message".into(), Dynamic::from(message.to_string()));
map
});
engine.register_fn("error", |message: &str| -> Map {
let mut map = Map::new();
map.insert("error".into(), Dynamic::from(true));
map.insert("message".into(), Dynamic::from(message.to_string()));
map
});
debug!("Registered ERROR keyword");
}
pub fn is_error_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
engine.register_fn("IS_ERROR", |v: Dynamic| -> bool {
if v.is_map() {
if let Ok(map) = v.as_map() {
return map.contains_key("error")
&& map
.get("error")
.map(|e| e.as_bool().unwrap_or(false))
.unwrap_or(false);
}
}
false
});
engine.register_fn("is_error", |v: Dynamic| -> bool {
if v.is_map() {
if let Ok(map) = v.as_map() {
return map.contains_key("error")
&& map
.get("error")
.map(|e| e.as_bool().unwrap_or(false))
.unwrap_or(false);
}
}
false
});
engine.register_fn("ISERROR", |v: Dynamic| -> bool {
if v.is_map() {
if let Ok(map) = v.as_map() {
return map.contains_key("error")
&& map
.get("error")
.map(|e| e.as_bool().unwrap_or(false))
.unwrap_or(false);
}
}
false
});
engine.register_fn("GET_ERROR_MESSAGE", |v: Dynamic| -> String {
if v.is_map() {
if let Ok(map) = v.as_map() {
if let Some(msg) = map.get("message") {
return msg.to_string();
}
}
}
String::new()
});
debug!("Registered IS_ERROR keyword");
}
pub fn assert_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
engine.register_fn(
"ASSERT",
|condition: bool, message: &str| -> Result<bool, Box<EvalAltResult>> {
if condition {
Ok(true)
} else {
Err(Box::new(EvalAltResult::ErrorRuntime(
format!("Assertion failed: {}", message).into(),
Position::NONE,
)))
}
},
);
engine.register_fn(
"assert",
|condition: bool, message: &str| -> Result<bool, Box<EvalAltResult>> {
if condition {
Ok(true)
} else {
Err(Box::new(EvalAltResult::ErrorRuntime(
format!("Assertion failed: {}", message).into(),
Position::NONE,
)))
}
},
);
debug!("Registered ASSERT keyword");
}
pub fn log_error_keyword(_state: &Arc<AppState>, _user: UserSession, engine: &mut Engine) {
engine.register_fn("LOG_ERROR", |message: &str| {
log::error!("BASIC Script Error: {}", message);
});
engine.register_fn("log_error", |message: &str| {
log::error!("BASIC Script Error: {}", message);
});
engine.register_fn("LOG_WARN", |message: &str| {
log::warn!("BASIC Script Warning: {}", message);
});
engine.register_fn("LOG_INFO", |message: &str| {
log::info!("BASIC Script: {}", message);
});
engine.register_fn("LOG_DEBUG", |message: &str| {
log::trace!("BASIC Script Debug: {}", message);
});
debug!("Registered LOG_ERROR keyword");
}
#[cfg(test)]
mod tests {
#[test]
fn test_error_map() {
use rhai::{Dynamic, Map};
let mut map = Map::new();
map.insert("error".into(), Dynamic::from(true));
map.insert("message".into(), Dynamic::from("test error"));
assert!(map.contains_key("error"));
assert_eq!(map.get("error").unwrap().as_bool().unwrap_or(false), true);
}
}