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}