Skip to main content

manabrew_engine/
game_log.rs

1use crate::game_log_entry::GameLogEntry;
2use crate::game_log_entry_type::GameLogEntryType;
3use crate::game_log_formatter::{ConsoleGameLogFormatter, GameLogFormatter};
4
5/// Engine game logger.
6/// Mirrors Java `GameLog`.
7pub struct GameLog {
8    enabled: bool,
9    formatter: Box<dyn GameLogFormatter>,
10}
11
12impl Default for GameLog {
13    fn default() -> Self {
14        Self::new()
15    }
16}
17
18impl GameLog {
19    pub fn new() -> Self {
20        Self {
21            enabled: Self::enabled_from_env(),
22            formatter: Box::new(ConsoleGameLogFormatter),
23        }
24    }
25
26    pub fn with_enabled(mut self, enabled: bool) -> Self {
27        self.enabled = enabled;
28        self
29    }
30
31    pub fn set_enabled(&mut self, enabled: bool) {
32        self.enabled = enabled;
33    }
34
35    pub fn enabled(&self) -> bool {
36        self.enabled
37    }
38
39    pub fn log(&self, entry_type: GameLogEntryType, indent: usize, message: impl Into<String>) {
40        if !self.enabled {
41            return;
42        }
43        let entry = GameLogEntry::new(entry_type, indent, message);
44        eprintln!("{}", self.formatter.format(&entry));
45    }
46
47    fn enabled_from_env() -> bool {
48        match std::env::var("manabrew_engine_GAME_LOG") {
49            Ok(value) => {
50                let v = value.trim().to_ascii_lowercase();
51                !(v == "0" || v == "false" || v == "off")
52            }
53            Err(_) => false,
54        }
55    }
56}