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}