1extern crate self as lumen_engine;
4
5use std::sync::atomic::{AtomicU8, Ordering};
6
7use crate::error::LumenError;
8
9#[cfg(all(feature = "ffmpeg", target_arch = "wasm32", target_os = "unknown"))]
10compile_error!("Lumen's ffmpeg feature is native-only; use browser media APIs on wasm.");
11
12pub mod audio;
13pub mod composition;
14pub mod error;
15pub mod expr;
16pub mod gpu;
17pub mod graph;
18pub mod media;
19pub mod node;
20
21#[cfg(feature = "ffmpeg")]
22pub use media::ffmpeg;
23
24#[cfg(feature = "image")]
25pub use media::image;
26
27#[cfg(feature = "json")]
28pub mod json;
29
30pub(crate) type Result<T> = std::result::Result<T, LumenError>;
31
32static LOG_LEVEL: AtomicU8 = AtomicU8::new(LogLevel::Off as u8);
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq)]
35#[repr(u8)]
36pub enum LogLevel {
37 Off = 0,
38 Error = 1,
39 Warn = 2,
40 Info = 3,
41 Debug = 4,
42 Trace = 5,
43}
44
45impl LogLevel {
46 pub fn parse(value: &str) -> Option<Self> {
47 match value {
48 "off" | "OFF" | "0" => Some(Self::Off),
49 "error" | "ERROR" => Some(Self::Error),
50 "warn" | "WARN" | "warning" | "WARNING" => Some(Self::Warn),
51 "info" | "INFO" => Some(Self::Info),
52 "debug" | "DEBUG" => Some(Self::Debug),
53 "trace" | "TRACE" | "1" | "true" | "TRUE" => Some(Self::Trace),
54 _ => None,
55 }
56 }
57
58 fn enables(self, level: tracing::Level) -> bool {
59 (self as u8)
60 >= match level {
61 tracing::Level::ERROR => Self::Error as u8,
62 tracing::Level::WARN => Self::Warn as u8,
63 tracing::Level::INFO => Self::Info as u8,
64 tracing::Level::DEBUG => Self::Debug as u8,
65 tracing::Level::TRACE => Self::Trace as u8,
66 }
67 }
68}
69
70pub fn set_log_level(level: LogLevel) {
71 LOG_LEVEL.store(level as u8, Ordering::Relaxed);
72}
73
74pub fn set_log_level_from_str(level: &str) -> std::result::Result<(), String> {
75 let Some(level) = LogLevel::parse(level) else {
76 return Err(format!(
77 "invalid log level '{level}', expected off, error, warn, info, debug, or trace"
78 ));
79 };
80 set_log_level(level);
81 Ok(())
82}
83
84pub fn log_level_enabled(level: tracing::Level) -> bool {
85 let configured = match LOG_LEVEL.load(Ordering::Relaxed) {
86 0 => LogLevel::Off,
87 1 => LogLevel::Error,
88 2 => LogLevel::Warn,
89 3 => LogLevel::Info,
90 4 => LogLevel::Debug,
91 _ => LogLevel::Trace,
92 };
93 configured.enables(level)
94}