pretty_exec_lib/
pretty_exec.rs

1use super::log::{Log, Logger, Nothing};
2use pipe_trait::Pipe;
3use std::{
4    ffi::OsStr,
5    io,
6    ops::Deref,
7    process::{Command, ExitStatus},
8};
9
10pub struct PrettyExec<Prompt, Program, Arguments, PreLog, PostLog> {
11    pub prompt: Prompt,
12    pub program: Program,
13    pub arguments: Arguments,
14    pub log_before: PreLog,
15    pub log_after: PostLog,
16}
17
18impl<Prompt, Program, Arguments, PreLog, PostLog>
19    PrettyExec<Prompt, Program, Arguments, PreLog, PostLog>
20{
21    pub fn spawn<'a>(&'a self) -> io::Result<ExitStatus>
22    where
23        Prompt: Deref,
24        Program: AsRef<OsStr> + Deref,
25        Arguments: Deref,
26        &'a Arguments::Target: IntoIterator,
27        <&'a Arguments::Target as IntoIterator>::Item: AsRef<OsStr>,
28        Logger<'a, PreLog, Prompt::Target, Program::Target, Arguments::Target>: Log,
29        Logger<'a, PostLog, Prompt::Target, Program::Target, Arguments::Target>: Log,
30    {
31        Logger::new(
32            &self.log_before,
33            self.prompt.deref(),
34            self.program.deref(),
35            self.arguments.deref(),
36        )
37        .log();
38        let result = self
39            .program
40            .pipe_ref(Command::new)
41            .args(self.arguments.deref())
42            .spawn()?
43            .wait();
44        Logger::new(
45            &self.log_after,
46            self.prompt.deref(),
47            self.program.deref(),
48            self.arguments.deref(),
49        )
50        .log();
51        result
52    }
53
54    pub fn set_log_before<Logger>(
55        self,
56        log_before: Logger,
57    ) -> PrettyExec<Prompt, Program, Arguments, Logger, PostLog> {
58        PrettyExec {
59            prompt: self.prompt,
60            program: self.program,
61            arguments: self.arguments,
62            log_after: self.log_after,
63            log_before,
64        }
65    }
66
67    pub fn set_log_after<Logger>(
68        self,
69        log_after: Logger,
70    ) -> PrettyExec<Prompt, Program, Arguments, PreLog, Logger> {
71        PrettyExec {
72            prompt: self.prompt,
73            program: self.program,
74            arguments: self.arguments,
75            log_before: self.log_before,
76            log_after,
77        }
78    }
79}
80
81impl<Prompt, Program, Arguments> PrettyExec<Prompt, Program, Arguments, Nothing, Nothing> {
82    pub fn new(prompt: Prompt, program: Program, arguments: Arguments) -> Self {
83        PrettyExec {
84            prompt,
85            program,
86            arguments,
87            log_before: Nothing,
88            log_after: Nothing,
89        }
90    }
91}