main.rs 3.1 KB

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