aopt_shell/shell/
bash.rs

1use std::io::Write;
2use std::marker::PhantomData;
3
4use crate::acore::Error;
5use crate::shell::Shell;
6use crate::SHELL_BASH;
7
8pub struct Bash<O, W> {
9    w: Option<W>,
10    __marker: PhantomData<O>,
11}
12
13impl<O, W> Default for Bash<O, W> {
14    fn default() -> Self {
15        Self {
16            w: Default::default(),
17            __marker: Default::default(),
18        }
19    }
20}
21
22impl<O, W> Bash<O, W> {
23    pub fn new() -> Self {
24        Self {
25            w: None,
26            __marker: PhantomData,
27        }
28    }
29
30    pub fn buffer(&mut self) -> Result<&mut W, Error> {
31        self.w
32            .as_mut()
33            .ok_or_else(|| crate::error!("must set buffer before write to"))
34    }
35
36    pub fn with_buffer(mut self, w: W) -> Self {
37        self.w = Some(w);
38        self
39    }
40}
41
42macro_rules! wln2buf {
43    ($w:expr, $fmt:literal, $($arg:tt)*) => {
44        writeln!( $w, $fmt, $($arg)* )
45            .map_err(|e| $crate::error!("can not write to buffer: {e:?}"))
46    };
47}
48
49impl<O, W> Shell<O, W> for Bash<O, W>
50where
51    W: Write,
52{
53    type Err = Error;
54
55    fn is_avail(&self, name: &str) -> bool {
56        name == SHELL_BASH
57    }
58
59    fn set_buff(&mut self, w: W) {
60        self.w = Some(w);
61    }
62
63    fn write_cmd(&mut self, name: &str, _: &O) -> Result<(), Self::Err> {
64        wln2buf!(self.buffer()?, "{}", name)
65    }
66
67    fn write_opt(&mut self, name: &str, _: &O) -> Result<(), Self::Err> {
68        wln2buf!(self.buffer()?, "{}", name)
69    }
70
71    fn write_pos(&mut self, name: &str, _: &O) -> Result<(), Self::Err> {
72        wln2buf!(self.buffer()?, "{}", name)
73    }
74
75    fn write_val(&mut self, val: &std::ffi::OsStr, _: &O) -> Result<(), Self::Err> {
76        wln2buf!(self.buffer()?, "{}", val.display())
77    }
78
79    fn write_eq(&mut self, _: &str, val: &std::ffi::OsStr, _: &O) -> Result<(), Self::Err> {
80        wln2buf!(self.buffer()?, "{}", val.display())
81    }
82
83    fn finish(&mut self) -> Result<(), Self::Err> {
84        Ok(())
85    }
86
87    fn take_buff(&mut self) -> Option<W> {
88        self.w.take()
89    }
90}