studiole_command/services/
progress_writer_factory.rs1use crate::prelude::*;
3use indicatif::MultiProgress;
4use tracing_subscriber::fmt::MakeWriter;
5
6#[derive(Clone)]
12pub struct ProgressWriterFactory {
13 multi: MultiProgress,
14}
15
16impl ProgressWriterFactory {
17 #[must_use]
21 pub fn multi(&self) -> MultiProgress {
22 self.multi.clone()
23 }
24}
25
26impl FromServices for ProgressWriterFactory {
27 type Error = ResolveError;
28
29 fn from_services(_services: &ServiceProvider) -> Result<Self, Report<Self::Error>> {
30 Ok(Self {
31 multi: MultiProgress::new(),
32 })
33 }
34}
35
36impl<'a> MakeWriter<'a> for ProgressWriterFactory {
37 type Writer = ProgressWriter<'a>;
38 fn make_writer(&'a self) -> Self::Writer {
39 ProgressWriter::new(&self.multi)
40 }
41}
42
43#[cfg(all(test, feature = "server"))]
44mod tests {
45 use super::*;
46 use std::io::Write;
47
48 #[test]
50 fn progress_writer_factory_make_writer_write() {
51 let factory = ProgressWriterFactory {
53 multi: MultiProgress::with_draw_target(indicatif::ProgressDrawTarget::hidden()),
54 };
55 let mut writer = factory.make_writer();
56 let count = writer.write(b"x").expect("write should succeed");
58 assert_eq!(count, 1);
60 }
61
62 #[test]
64 fn progress_writer_factory_from_services() {
65 let services = ServiceBuilder::new().build();
67 let factory = ProgressWriterFactory::from_services(&services);
69 assert!(factory.is_ok());
71 }
72}