1 use clap::Parser; 2 use logmonitor::app::{App, AppResult}; 3 use logmonitor::command::{self, CommandLineArgs}; 4 use logmonitor::constant::CMD_ARGS; 5 use logmonitor::event::{Event, EventHandler}; 6 use logmonitor::handler::{handle_backend_events, handle_key_events}; 7 use logmonitor::logging::LoggingInitResult; 8 use logmonitor::tui::Tui; 9 use ratatui::backend::CrosstermBackend; 10 use ratatui::Terminal; 11 use std::io; 12 13 extern crate log; 14 15 fn main() -> AppResult<()> { 16 let command_line_args = command::CommandLineArgs::parse(); 17 *CMD_ARGS.write().unwrap() = Some(command_line_args.clone()); 18 println!("{:?}", command_line_args); 19 prepare_env(); 20 21 let logging_init_result = logmonitor::logging::init(&command_line_args); 22 if !command_line_args.tui { 23 return start_headless_app(command_line_args, logging_init_result); 24 } else { 25 return start_tui_app(command_line_args, logging_init_result); 26 } 27 } 28 29 fn prepare_env() { 30 // 创建日志文件夹 31 let p = CMD_ARGS.read().unwrap().clone(); 32 let log_dir = p.unwrap().log_dir; 33 std::fs::create_dir_all(log_dir).expect("Failed to create log directory."); 34 } 35 36 /// 启动无界面应用 37 fn start_headless_app( 38 cmdargs: CommandLineArgs, 39 _logging_init_result: LoggingInitResult, 40 ) -> AppResult<()> { 41 let mut app = App::new("DragonOS Log Monitor"); 42 let events = EventHandler::new(250); 43 let _app_backend = logmonitor::backend::AppBackend::new(cmdargs.clone(), events.sender()); 44 45 while app.running { 46 match events.next()? { 47 Event::Tick => app.tick(), 48 Event::Key(key_event) => handle_key_events(key_event, &mut app)?, 49 Event::Mouse(_) => {} 50 Event::Resize(_, _) => {} 51 Event::Backend(e) => { 52 handle_backend_events(e, &mut app)?; 53 } 54 } 55 } 56 println!("Headless mode not implemented yet."); 57 Ok(()) 58 } 59 60 /// 启动TUI应用 61 fn start_tui_app( 62 cmdargs: CommandLineArgs, 63 logging_init_result: LoggingInitResult, 64 ) -> AppResult<()> { 65 // Create an application. 66 let mut app = App::new("DragonOS Log Monitor"); 67 if let Some(receiver) = logging_init_result.tui_receiver { 68 app.set_backend_log_receiver(receiver); 69 } 70 71 // Initialize the terminal user interface. 72 let backend = CrosstermBackend::new(io::stderr()); 73 let terminal = Terminal::new(backend)?; 74 let events = EventHandler::new(250); 75 let mut tui = Tui::new(terminal, events); 76 tui.init()?; 77 let _app_backend = logmonitor::backend::AppBackend::new(cmdargs.clone(), tui.events.sender()); 78 79 // Start the main loop. 80 while app.running { 81 // Render the user interface. 82 tui.draw(&mut app)?; 83 // Handle events. 84 match tui.events.next()? { 85 Event::Tick => app.tick(), 86 Event::Key(key_event) => handle_key_events(key_event, &mut app)?, 87 Event::Mouse(_) => {} 88 Event::Resize(_, _) => {} 89 Event::Backend(e) => { 90 handle_backend_events(e, &mut app)?; 91 } 92 } 93 } 94 95 // Exit the user interface. 96 tui.exit()?; 97 Ok(()) 98 } 99