embedded_cli/
builder.rs

1use core::{convert::Infallible, fmt::Debug};
2
3use embedded_io::{Error, Write};
4
5use crate::{buffer::Buffer, cli::Cli, writer::EmptyWriter};
6
7pub const DEFAULT_CMD_LEN: usize = 40;
8pub const DEFAULT_HISTORY_LEN: usize = 100;
9pub const DEFAULT_PROMPT: &str = "$ ";
10
11pub struct CliBuilder<W: Write<Error = E>, E: Error, CommandBuffer: Buffer, HistoryBuffer: Buffer> {
12    pub(crate) command_buffer: CommandBuffer,
13    pub(crate) history_buffer: HistoryBuffer,
14    pub(crate) prompt: &'static str,
15    pub(crate) writer: W,
16}
17
18impl<W, E, CommandBuffer, HistoryBuffer> Debug for CliBuilder<W, E, CommandBuffer, HistoryBuffer>
19where
20    W: Write<Error = E>,
21    E: Error,
22    CommandBuffer: Buffer,
23    HistoryBuffer: Buffer,
24{
25    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
26        f.debug_struct("CliBuilder")
27            .field("command_buffer", &self.command_buffer.as_slice())
28            .field("history_buffer", &self.history_buffer.as_slice())
29            .finish()
30    }
31}
32
33impl<W, E, CommandBuffer, HistoryBuffer> CliBuilder<W, E, CommandBuffer, HistoryBuffer>
34where
35    W: Write<Error = E>,
36    E: Error,
37    CommandBuffer: Buffer,
38    HistoryBuffer: Buffer,
39{
40    pub fn build(self) -> Result<Cli<W, E, CommandBuffer, HistoryBuffer>, E> {
41        Cli::from_builder(self)
42    }
43
44    pub fn command_buffer<B: Buffer>(
45        self,
46        command_buffer: B,
47    ) -> CliBuilder<W, E, B, HistoryBuffer> {
48        CliBuilder {
49            command_buffer,
50            history_buffer: self.history_buffer,
51            writer: self.writer,
52            prompt: self.prompt,
53        }
54    }
55
56    pub fn history_buffer<B: Buffer>(
57        self,
58        history_buffer: B,
59    ) -> CliBuilder<W, E, CommandBuffer, B> {
60        CliBuilder {
61            command_buffer: self.command_buffer,
62            history_buffer,
63            writer: self.writer,
64            prompt: self.prompt,
65        }
66    }
67
68    pub fn prompt(self, prompt: &'static str) -> Self {
69        CliBuilder {
70            command_buffer: self.command_buffer,
71            history_buffer: self.history_buffer,
72            writer: self.writer,
73            prompt,
74        }
75    }
76
77    pub fn writer<T: Write<Error = TE>, TE: Error>(
78        self,
79        writer: T,
80    ) -> CliBuilder<T, TE, CommandBuffer, HistoryBuffer> {
81        CliBuilder {
82            command_buffer: self.command_buffer,
83            history_buffer: self.history_buffer,
84            writer,
85            prompt: self.prompt,
86        }
87    }
88}
89
90impl Default
91    for CliBuilder<EmptyWriter, Infallible, [u8; DEFAULT_CMD_LEN], [u8; DEFAULT_HISTORY_LEN]>
92{
93    fn default() -> Self {
94        Self {
95            command_buffer: [0; DEFAULT_CMD_LEN],
96            history_buffer: [0; DEFAULT_HISTORY_LEN],
97            writer: EmptyWriter,
98            prompt: DEFAULT_PROMPT,
99        }
100    }
101}