|
3 | 3 |
|
4 | 4 | use crate::anyhow;
|
5 | 5 | use crate::debug;
|
| 6 | +use crate::info; |
| 7 | +use crate::warn; |
| 8 | +use slog::crit; |
| 9 | +use slog::error; |
| 10 | +use slog::trace; |
| 11 | + |
6 | 12 | use crate::fs;
|
7 | 13 | use crate::json;
|
8 | 14 | use crate::run_command;
|
@@ -255,7 +261,9 @@ pub async fn interpreter(
|
255 | 261 | let interface = sp.interface().to_string().to_owned();
|
256 | 262 | let reset_watchdog_timeout_ms = sp.reset_watchdog_timeout_ms() as i64;
|
257 | 263 |
|
| 264 | + let thread_log = log.clone(); |
258 | 265 | let handle = std::thread::spawn(move || {
|
| 266 | + let log = thread_log; |
259 | 267 | // Create Engine
|
260 | 268 | let mut engine = Engine::new();
|
261 | 269 |
|
@@ -320,15 +328,14 @@ pub async fn interpreter(
|
320 | 328 | // Offer proper JSON to Dynamic::Map conversion
|
321 | 329 | .register_fn("json_to_map", move |v: Dynamic| -> Dynamic {
|
322 | 330 | match v.into_string() {
|
323 |
| - Ok(s) => { |
324 |
| - match serde_json::from_str::<Dynamic>(&s) { |
325 |
| - Ok(v) => v, |
326 |
| - Err(e) => { |
327 |
| - let err = format!("{{\"error\": \"{:?}\"}}", e).to_string(); |
328 |
| - serde_json::from_str::<Dynamic>(&err).unwrap() |
329 |
| - } |
| 331 | + Ok(s) => match serde_json::from_str::<Dynamic>(&s) { |
| 332 | + Ok(v) => v, |
| 333 | + Err(e) => { |
| 334 | + let err = format!("{{\"error\": \"{:?}\"}}", e) |
| 335 | + .to_string(); |
| 336 | + serde_json::from_str::<Dynamic>(&err).unwrap() |
330 | 337 | }
|
331 |
| - } |
| 338 | + }, |
332 | 339 | Err(e) => {
|
333 | 340 | let err =
|
334 | 341 | format!("{{\"error\": \"{:?}\"}}", e).to_string();
|
@@ -369,6 +376,50 @@ pub async fn interpreter(
|
369 | 376 | },
|
370 | 377 | );
|
371 | 378 |
|
| 379 | + // A script can log via debug at any level: |
| 380 | + // debug("INFO|log message at INFO level"); |
| 381 | + // debug("CRIT|log message at CRIT level"); |
| 382 | + // etc. |
| 383 | + let rhai_log = log.clone(); |
| 384 | + engine.on_debug(move |x, src, pos| { |
| 385 | + let src = if src.is_some() { |
| 386 | + format!("{}@", src.unwrap()) |
| 387 | + } else { |
| 388 | + "".to_string() |
| 389 | + }; |
| 390 | + let x: Vec<&str> = x.trim_matches('"').splitn(2, '|').collect(); |
| 391 | + let (level, msg) = if x.len() == 1 { |
| 392 | + ("info".to_string(), x[0].to_string()) |
| 393 | + } else { |
| 394 | + let level = x[0].to_string().to_lowercase(); |
| 395 | + let msg = x[1].to_string(); |
| 396 | + match level.as_str() { |
| 397 | + "info" => ("info".to_string(), msg), |
| 398 | + "crit" => ("crit".to_string(), msg), |
| 399 | + "error" => ("error".to_string(), msg), |
| 400 | + "trace" => ("trace".to_string(), msg), |
| 401 | + "warn" => ("warn".to_string(), msg), |
| 402 | + "debug" => ("debug".to_string(), msg), |
| 403 | + _ => ("debug".to_string(), format!("{}|{}", level, msg)), |
| 404 | + } |
| 405 | + }; |
| 406 | + let src = if src.len() > 0 { |
| 407 | + format!("{}@", src) |
| 408 | + } else { |
| 409 | + "".to_string() |
| 410 | + }; |
| 411 | + let msg = format!("{}pos={:?} {}", src, pos, msg); |
| 412 | + match level.as_str() { |
| 413 | + "crit" => crit!(rhai_log, "{msg}"), |
| 414 | + "debug" => debug!(rhai_log, "{msg}"), |
| 415 | + "error" => error!(rhai_log, "{msg}"), |
| 416 | + "info" => info!(rhai_log, "{msg}"), |
| 417 | + "trace" => trace!(rhai_log, "{msg}"), |
| 418 | + "warn" => warn!(rhai_log, "{msg}"), |
| 419 | + _ => unreachable!(), |
| 420 | + } |
| 421 | + }); |
| 422 | + |
372 | 423 | // Print registered functions if you're interested.
|
373 | 424 |
|
374 | 425 | // engine.gen_fn_signatures(false).into_iter().for_each(|func| println!("{func}"));
|
|
0 commit comments