use crate::prelude::*;
pub trait WithLogging {
#[must_use]
fn with_logging(
self,
factory: fn(&ServiceProvider) -> Result<Logger, Report<ResolveError>>,
) -> Self;
}
impl WithLogging for ServiceBuilder {
fn with_logging(
self,
factory: fn(&ServiceProvider) -> Result<Logger, Report<ResolveError>>,
) -> Self {
self.with_instance(LoggerFactory::new(factory))
.with_type::<Logger>()
.with_init::<Logger>()
}
}
#[cfg(test)]
mod tests {
use super::*;
struct AppCliOptions {
pub log_level: LogLevel,
}
#[test]
fn service_builder_with_logging_init() {
let services = ServiceBuilder::new()
.with_instance(AppCliOptions {
log_level: LogLevel::Info,
})
.with_logging(|services| {
let cli = services.get::<AppCliOptions>()?;
Ok(LoggerBuilder::new().with_level(cli.log_level).build())
})
.build();
let output = services.init();
assert!(output.is_ok());
}
#[test]
fn service_builder_with_logging_init_twice() {
let services = ServiceBuilder::new()
.with_instance(AppCliOptions {
log_level: LogLevel::Info,
})
.with_logging(|services| {
let cli = services.get::<AppCliOptions>()?;
Ok(LoggerBuilder::new().with_level(cli.log_level).build())
})
.build();
let output = services.init();
assert!(output.is_ok());
}
#[test]
fn service_builder_with_logging() {
let services = ServiceBuilder::new()
.with_instance(AppCliOptions {
log_level: LogLevel::Trace,
})
.with_logging(|services| {
let cli = services.get::<AppCliOptions>()?;
Ok(LoggerBuilder::new()
.with_level(cli.log_level)
.with_target("noisy_crate", LogLevel::Warn)
.build())
})
.build();
let logger = services.get::<Logger>();
assert!(logger.is_ok());
assert_eq!(logger.expect("should resolve").level, LogLevel::Trace);
}
}