cursive_logger_view/toggle.rs
1//! ## Add toggleable flexi_logger debug console view
2//!
3//! This crate provides utility functions, which is simplify usage of
4//! `FlexiLoggerView`, providing debug console view like
5//! [`Cursive::toggle_debug_console`](/cursive/latest/cursive/struct.Cursive.
6//! html#method.toggle_debug_console). There is 3 functions:
7//!
8//! - `show_flexi_logger_debug_console`: show debug console view;
9//! - `hide_flexi_logger_debug_console`: hide debug console view (if visible);
10//! - `toggle_flexi_logger_debug_console`: show the debug console view, or hide
11//! it if it's already visible.
12
13use cursive_core::{view::Nameable, views::Dialog, Cursive};
14use tap::Pipe;
15
16use crate::{FlexiLoggerView, FLEXI_LOGGER_DEBUG_VIEW_NAME};
17
18/// Show the flexi_logger debug console.
19///
20/// This is analog to
21/// [`Cursive::show_debug_console`](/cursive/latest/cursive/struct.Cursive.html#
22/// method.show_debug_console).
23///
24/// # Add binding to show flexi_logger debug view
25///
26/// ```rust
27/// use cursive::{Cursive, CursiveExt};
28/// use cursive_logger_view::toggle::show_flexi_logger_debug_console;
29/// use flexi_logger::Logger;
30///
31/// // we need to initialize cursive first, as the cursive-logger-view
32/// // needs a cursive callback sink to notify cursive about screen refreshs
33/// // when a new log message arrives
34/// let mut siv = Cursive::default();
35///
36/// Logger::try_with_env_or_str("trace")
37/// .expect("Could not create Logger from environment :(")
38/// .log_to_file_and_writer(
39/// flexi_logger::FileSpec::default()
40/// .directory("logs")
41/// .suppress_timestamp(),
42/// cursive_logger_view::boxed_flexi_log_writer(&siv)
43/// )
44/// .start()
45/// .expect("failed to initialize logger!");
46///
47/// siv.add_global_callback('~', show_flexi_logger_debug_console); // Add binding to show flexi_logger debug view
48///
49/// // siv.run();
50/// ```
51pub fn show_flexi_logger_debug_console(siv: &mut Cursive) {
52 FlexiLoggerView::new()
53 .wrap_scroll_view()
54 .with_name(FLEXI_LOGGER_DEBUG_VIEW_NAME)
55 .pipe(Dialog::around)
56 .title("Debug console")
57 .pipe(|v| siv.add_layer(v))
58}
59
60/// Hide the flexi_logger debug console (if visible).
61///
62/// # Add binding to hide flexi_logger debug view
63///
64/// ```rust
65/// use cursive::{Cursive, CursiveExt};
66/// use cursive_logger_view::toggle::hide_flexi_logger_debug_console;
67/// use flexi_logger::Logger;
68/// // we need to initialize cursive first, as the cursive-logger-view
69/// // needs a cursive callback sink to notify cursive about screen refreshs
70/// // when a new log message arrives
71/// let mut siv = Cursive::default();
72///
73/// Logger::try_with_env_or_str("trace")
74/// .expect("Could not create Logger from environment :(")
75/// .log_to_file_and_writer(
76/// flexi_logger::FileSpec::default()
77/// .directory("logs")
78/// .suppress_timestamp(),
79/// cursive_logger_view::boxed_flexi_log_writer(&siv)
80/// )
81/// .start()
82/// .expect("failed to initialize logger!");
83///
84/// siv.add_global_callback('~', hide_flexi_logger_debug_console); // Add binding to hide flexi_logger debug view
85///
86/// // siv.run();
87/// ```
88pub fn hide_flexi_logger_debug_console(siv: &mut Cursive) {
89 if let Some(pos) = siv
90 .screen_mut()
91 .find_layer_from_name(FLEXI_LOGGER_DEBUG_VIEW_NAME)
92 {
93 siv
94 .screen_mut()
95 .remove_layer(pos);
96 }
97}
98
99/// Show the flexi_logger debug console, or hide it if it's already visible.
100///
101/// This is analog to
102/// [`Cursive::toggle_debug_console`](/cursive/latest/cursive/struct.Cursive.
103/// html#method.toggle_debug_console).
104///
105/// # Enable toggleable flexi_logger debug view
106///
107/// ```rust
108/// use cursive::{Cursive, CursiveExt};
109/// use cursive_logger_view::toggle::toggle_flexi_logger_debug_console;
110/// use flexi_logger::Logger;
111/// // we need to initialize cursive first, as the cursive-logger-view
112/// // needs a cursive callback sink to notify cursive about screen refreshs
113/// // when a new log message arrives
114/// let mut siv = Cursive::default();
115///
116/// Logger::try_with_env_or_str("trace")
117/// .expect("Could not create Logger from environment :(")
118/// .log_to_file_and_writer(
119/// flexi_logger::FileSpec::default()
120/// .directory("logs")
121/// .suppress_timestamp(),
122/// cursive_logger_view::boxed_flexi_log_writer(&siv)
123/// )
124/// .start()
125/// .expect("failed to initialize logger!");
126///
127/// siv.add_global_callback('~', toggle_flexi_logger_debug_console); // Enable toggleable flexi_logger debug view
128///
129/// // siv.run();
130/// ```
131pub fn toggle_flexi_logger_debug_console(siv: &mut Cursive) {
132 match siv
133 .screen_mut()
134 .find_layer_from_name(FLEXI_LOGGER_DEBUG_VIEW_NAME)
135 {
136 Some(pos) => {
137 siv
138 .screen_mut()
139 .remove_layer(pos);
140 }
141 _ => show_flexi_logger_debug_console(siv),
142 }
143}