Skip to main content

lumen_engine/
lib.rs

1//! Lumen compositing engine crate.
2
3extern 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}