dear_imgui_rs/
logging.rs

1//! Logging utilities for Dear ImGui
2//!
3//! This module provides convenient logging setup and utilities for Dear ImGui applications.
4//! It supports both `tracing` (recommended) and `log` crate backends.
5
6#[cfg(feature = "tracing")]
7use tracing::{debug, info};
8
9/// Initialize tracing subscriber with sensible defaults for Dear ImGui applications
10#[cfg(feature = "tracing")]
11pub fn init_tracing() {
12    use tracing_subscriber::{EnvFilter, fmt};
13
14    let filter = EnvFilter::try_from_default_env()
15        .unwrap_or_else(|_| {
16            // Default filter: show info+ for dear_imgui, warn+ for everything else
17            "dear_imgui=info,dear_imgui_wgpu=info,dear_imgui_winit=info,dear_imgui_glow=info,dear_imgui_bevy=info,warn".into()
18        });
19
20    fmt()
21        .with_env_filter(filter)
22        .with_target(true)
23        .with_thread_ids(false)
24        .with_file(false)
25        .with_line_number(false)
26        .init();
27}
28
29/// Initialize tracing subscriber with custom filter
30#[cfg(feature = "tracing")]
31pub fn init_tracing_with_filter(filter: &str) {
32    use tracing_subscriber::{EnvFilter, fmt};
33
34    let filter = EnvFilter::new(filter);
35
36    fmt()
37        .with_env_filter(filter)
38        .with_target(true)
39        .with_thread_ids(false)
40        .with_file(false)
41        .with_line_number(false)
42        .init();
43}
44
45/// Initialize tracing subscriber for development with more verbose output
46#[cfg(feature = "tracing")]
47pub fn init_tracing_dev() {
48    use tracing_subscriber::{EnvFilter, fmt};
49
50    let filter = EnvFilter::try_from_default_env()
51        .unwrap_or_else(|_| {
52            // Development filter: show debug+ for dear_imgui, info+ for everything else
53            "dear_imgui=debug,dear_imgui_wgpu=debug,dear_imgui_winit=debug,dear_imgui_glow=debug,dear_imgui_bevy=debug,info".into()
54        });
55
56    fmt()
57        .with_env_filter(filter)
58        .with_target(true)
59        .with_thread_ids(true)
60        .with_file(true)
61        .with_line_number(true)
62        .init();
63}
64
65/// Log context creation
66#[cfg(feature = "tracing")]
67pub fn log_context_created() {
68    info!("Dear ImGui context created successfully");
69}
70
71/// Log context destruction
72#[cfg(feature = "tracing")]
73pub fn log_context_destroyed() {
74    info!("Dear ImGui context destroyed");
75}
76
77/// Log renderer initialization
78#[cfg(feature = "tracing")]
79pub fn log_renderer_init(backend: &str) {
80    info!("Dear ImGui {} renderer initialized", backend);
81}
82
83/// Log platform initialization
84#[cfg(feature = "tracing")]
85pub fn log_platform_init(platform: &str) {
86    info!("Dear ImGui {} platform initialized", platform);
87}
88
89/// Log frame statistics
90#[cfg(feature = "tracing")]
91pub fn log_frame_stats(frame_time: f32, fps: f32) {
92    debug!("Frame time: {:.2}ms, FPS: {:.1}", frame_time * 1000.0, fps);
93}
94
95/// Log memory usage
96#[cfg(feature = "tracing")]
97pub fn log_memory_usage(vertices: usize, indices: usize, draw_calls: usize) {
98    debug!(
99        "Render stats - Vertices: {}, Indices: {}, Draw calls: {}",
100        vertices, indices, draw_calls
101    );
102}
103
104// Fallback implementations when tracing is not available
105#[cfg(not(feature = "tracing"))]
106pub fn init_tracing() {
107    eprintln!("Warning: tracing feature not enabled, logging disabled");
108}
109
110#[cfg(not(feature = "tracing"))]
111pub fn init_tracing_with_filter(_filter: &str) {
112    eprintln!("Warning: tracing feature not enabled, logging disabled");
113}
114
115#[cfg(not(feature = "tracing"))]
116pub fn init_tracing_dev() {
117    eprintln!("Warning: tracing feature not enabled, logging disabled");
118}
119
120#[cfg(not(feature = "tracing"))]
121pub fn log_context_created() {}
122
123#[cfg(not(feature = "tracing"))]
124pub fn log_context_destroyed() {}
125
126#[cfg(not(feature = "tracing"))]
127pub fn log_renderer_init(_backend: &str) {}
128
129#[cfg(not(feature = "tracing"))]
130pub fn log_platform_init(_platform: &str) {}
131
132#[cfg(not(feature = "tracing"))]
133pub fn log_frame_stats(_frame_time: f32, _fps: f32) {}
134
135#[cfg(not(feature = "tracing"))]
136pub fn log_memory_usage(_vertices: usize, _indices: usize, _draw_calls: usize) {}
137
138/// Macro for conditional tracing
139#[macro_export]
140macro_rules! imgui_trace {
141    ($($arg:tt)*) => {
142        #[cfg(feature = "tracing")]
143        tracing::trace!($($arg)*);
144    };
145}
146
147/// Macro for conditional debug logging
148#[macro_export]
149macro_rules! imgui_debug {
150    ($($arg:tt)*) => {
151        #[cfg(feature = "tracing")]
152        tracing::debug!($($arg)*);
153    };
154}
155
156/// Macro for conditional info logging
157#[macro_export]
158macro_rules! imgui_info {
159    ($($arg:tt)*) => {
160        #[cfg(feature = "tracing")]
161        tracing::info!($($arg)*);
162    };
163}
164
165/// Macro for conditional warning logging
166#[macro_export]
167macro_rules! imgui_warn {
168    ($($arg:tt)*) => {
169        #[cfg(feature = "tracing")]
170        tracing::warn!($($arg)*);
171    };
172}
173
174/// Macro for conditional error logging
175#[macro_export]
176macro_rules! imgui_error {
177    ($($arg:tt)*) => {
178        #[cfg(feature = "tracing")]
179        tracing::error!($($arg)*);
180    };
181}
182
183#[cfg(test)]
184mod tests {
185    #[test]
186    fn test_logging_macros() {
187        // Test that macros compile without tracing feature
188        imgui_trace!("test trace");
189        imgui_debug!("test debug");
190        imgui_info!("test info");
191        imgui_warn!("test warn");
192        imgui_error!("test error");
193    }
194}