commonlibsse_ng_proc_macro_common\skse_plugin_main/
logger.rs1use quote::quote;
2
3#[cfg(feature = "tracing")]
4#[derive(Debug, Default, darling::FromMeta, PartialEq, Eq)]
5pub(crate) enum LogLevel {
6 #[default]
7 Trace,
8 Debug,
9 Info,
10 Warn,
11 Error,
12}
13
14#[cfg(feature = "tracing")]
15impl LogLevel {
16 fn token(&self) -> proc_macro2::TokenStream {
17 let level = match self {
18 LogLevel::Trace => quote! { TRACE },
19 LogLevel::Debug => quote! { DEBUG },
20 LogLevel::Info => quote! { INFO },
21 LogLevel::Warn => quote! { WARN },
22 LogLevel::Error => quote! { ERROR },
23 };
24
25 quote! { commonlibsse_ng::__private::tracing::level_filters::LevelFilter::#level }
26 }
27}
28
29pub struct LoggerTokenStream {
30 pub init_logger: proc_macro2::TokenStream,
31 pub is_editor_log: proc_macro2::TokenStream,
32}
33
34impl Default for LoggerTokenStream {
35 fn default() -> Self {
36 Self { init_logger: quote! {}, is_editor_log: quote! {} }
37 }
38}
39
40#[cfg(feature = "tracing")]
41pub(crate) fn gen_logger_code(
42 enable_logger: bool,
43 plugin_name: Option<&str>,
44 log_level: LogLevel,
45) -> LoggerTokenStream {
46 let mut code = LoggerTokenStream::default();
47
48 if enable_logger {
49 let plugin_log_name = if let Some(plugin_name) = plugin_name {
50 quote! { concat!(#plugin_name, ".log") }
51 } else {
52 quote! { concat!(env!("CARGO_PKG_NAME"), ".log") }
53 };
54 let err_title = if let Some(plugin_name) = plugin_name {
55 let title = format!("{plugin_name} Error");
56 quote! { #title }
57 } else {
58 quote! {
59 concat!(env!("CARGO_PKG_NAME"), " Error")
60 }
61 };
62 let log_level = log_level.token();
63
64 code.init_logger = quote! {
65 if let Err(err) = commonlibsse_ng::skse::logger::init_with_log_dir(#plugin_log_name, #log_level) {
66 commonlibsse_ng::rex::win32::message_box(#err_title, &err.to_string());
67 std::process::exit(1);
68 };
69 commonlibsse_ng::__private::tracing::info!("Logger has been initialized.");
70 };
71
72 code.is_editor_log = quote! {
73 commonlibsse_ng::__private::tracing::error!("The use of the SKSE Plugin within Editor is not supported.");
74 };
75 };
76
77 code
78}