use crate::prelude::*;
use indicatif::MultiProgress;
use tracing_subscriber::fmt::MakeWriter;
#[derive(Clone)]
pub struct ProgressWriterFactory {
multi: MultiProgress,
}
impl ProgressWriterFactory {
#[must_use]
pub fn multi(&self) -> MultiProgress {
self.multi.clone()
}
}
impl FromServices for ProgressWriterFactory {
type Error = ResolveError;
fn from_services(_services: &ServiceProvider) -> Result<Self, Report<Self::Error>> {
Ok(Self {
multi: MultiProgress::new(),
})
}
}
impl<'a> MakeWriter<'a> for ProgressWriterFactory {
type Writer = ProgressWriter<'a>;
fn make_writer(&'a self) -> Self::Writer {
ProgressWriter::new(&self.multi)
}
}
#[cfg(all(test, feature = "server"))]
mod tests {
use super::*;
use std::io::Write;
#[test]
fn progress_writer_factory_make_writer_write() {
let factory = ProgressWriterFactory {
multi: MultiProgress::with_draw_target(indicatif::ProgressDrawTarget::hidden()),
};
let mut writer = factory.make_writer();
let count = writer.write(b"x").expect("write should succeed");
assert_eq!(count, 1);
}
#[test]
fn progress_writer_factory_from_services() {
let services = ServiceBuilder::new().build();
let factory = ProgressWriterFactory::from_services(&services);
assert!(factory.is_ok());
}
}