nom_reprap_response/
echo.rs1use nom::{
2 IResult,
3 character::streaming::*,
4 bytes::streaming::*,
5};
6use nom::branch::*;
7use nom::combinator::*;
8use nom::sequence::*;
9use crate::Busy;
12
13use super::{
14 Response,
15 SDCard,
16 Feedback,
17 StartSDWrite,
18 u32_str,
19};
20
21pub fn echo<'r>(input: &'r str) -> IResult<&'r str, Response> {
22 preceded(
23 pair(
24 tag_no_case("echo:"),
25 space0,
26 ),
27 alt((
28 busy,
29 m21_sd_card_ok,
30 m23_m28_fresh_file,
31 normal_echo_content,
32 )),
33 )(input)
34}
35
36fn normal_echo_content<'r>(input: &'r str) -> IResult<&'r str, Response> {
37 map(
38 not_line_ending,
39 |s: &str| Response::Echo(s.to_string()),
40 )(input)
41}
42
43fn m21_sd_card_ok<'r>(input: &'r str) -> IResult<&'r str, Response> {
49 map(
50 preceded(
51 tuple((
52 tag("SD card ok"),
53 space0,
54 line_ending,
55 take_until("\nsize:"),
56 space0,
57 line_ending,
58 )),
59 u32_str(),
60 ),
61 |size: u32| {
62 let sd_card = SDCard {
63 enabled: true,
64 size: Some(size),
65 };
66 Response::Ok(Some(Feedback::SDCard(sd_card)))
67 },
68 )(input)
69}
70
71fn m23_m28_fresh_file<'r>(input: &'r str) -> IResult<&'r str, Response> {
79 preceded(
80 tuple((
81 tag_no_case("Now fresh file:"),
82 not_line_ending,
83 line_ending,
84 )),
85 alt((
86 map(
88 preceded(
89 pair(
90 tag_no_case("Writing to file:"),
91 space0,
92 ),
93 not_line_ending,
94 ),
95 |filename: &str| {
96 let start_streaming = Feedback::StartSDWrite(StartSDWrite {
97 filename: filename.to_string(),
98 });
99
100 Response::Ok(Some(start_streaming))
101 },
102 ),
103 map(
106 recognize(tuple((
107 tag("File opened:"),
108 not_line_ending,
109 line_ending,
110 tag("File selected"),
111 ))),
112 |s: &str| Response::Debug(s.to_string())
113 ),
114 map(
116 preceded(
117 tag_no_case("open failed, File:"),
118 not_line_ending,
119 ),
120 |_| {
121 Response::Error("\
122 Failed to open sd card file. \
123 Check that SD card is inserted and enabled in firmware.\
124 ".to_string())
125 },
126 ),
127 )),
128 )(input)
129}
130
131fn busy<'r>(input: &'r str) -> IResult<&'r str, Response> {
148 preceded(
149 pair(
150 tag_no_case("busy:"),
151 space0,
152 ),
153 alt((
154 value(
155 Response::Feedback(Feedback::Busy(Busy::Processing)),
156 tag_no_case("processing"),
157 ),
158 value(
159 Response::Feedback(Feedback::Busy(Busy::PausedForUser)),
160 tag_no_case("paused for user"),
161 ),
162 map(
163 not_line_ending,
164 |s: &str| Response::Feedback(Feedback::Busy(Busy::Other(s.to_string()))),
165 ),
166 ))
167 )(input)
168}