pretty_exec_lib/
pretty_exec.rs1use 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}