ptouch_rs/command/
status.rs1use nom::{Finish, IResult, Parser, number::complete::u8};
2
3use crate::{
4 Error,
5 MediaType,
6 TapeColor,
7 TapeSize,
8 TextColor,
9 nom_utils::{tag, tag_multi, u16, u32, zero, zero_multi},
10 status_type::StatusType,
11};
12
13fn parse(input: &[u8]) -> IResult<&[u8], Status> {
14 let (input, _) = tag_multi([0x80, 0x20, b'B', b'0'])(input)?;
15
16 let (input, model) = u8(input)?;
17
18 let (input, _) = tag(b'0')(input)?;
19 let (input, _) = u16(input)?;
20
21 let (input, error) = u16(input)?;
22
23 let (input, media_width) = TapeSize::parse(input)?;
24
25 let (input, media_type) = MediaType::parse(input)?;
26
27 let (input, _) = zero_multi::<3>(input)?;
28 let (input, mode) = u8(input)?;
29
30 let (input, _) = zero_multi::<2>(input)?;
31
32 let (input, status_type) = StatusType::parse(input)?;
33 let (input, phase_type) = u8(input)?;
34 let (input, phase_number) = u16(input)?;
35 let (input, notification_number) = u8(input)?;
36
37 let (input, _) = zero(input)?;
38
39 let (input, tape_color) = TapeColor::parse(input)?;
40 let (input, text_color) = TextColor::parse(input)?;
41
42 let (input, hw_setting) = u32(input)?;
43
44 nom::combinator::all_consuming(u16).parse(input)?;
45
46 Ok((
47 &[],
48 Status {
49 model,
50 error,
51 media_width,
52 media_type,
53 mode,
54 status_type,
55 phase_type,
56 phase_number,
57 notification_number,
58 tape_color,
59 text_color,
60 hw_setting,
61 },
62 ))
63}
64
65#[derive(Debug, Clone)]
66#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
67pub struct Status {
68 pub model: u8,
69 pub error: u16,
70 pub media_width: TapeSize,
71 pub media_type: MediaType,
72 pub mode: u8,
73 pub status_type: StatusType,
74 pub phase_type: u8,
75 pub phase_number: u16,
76 pub notification_number: u8,
77 pub tape_color: TapeColor,
78 pub text_color: TextColor,
79 pub hw_setting: u32,
80}
81
82impl Status {
83 pub const fn message() -> &'static [u8] {
84 b"\x1biS"
85 }
86
87 pub fn from_request(buf: Vec<u8>) -> Result<Self, Error> {
88 match parse(&buf).finish() {
89 Ok((_, status)) => Ok(status),
90 Err(nom::error::Error { code, input }) => Err(nom::Err::Error(nom::error::Error {
91 code,
92 input: input.to_vec(),
93 }))?,
94 }
95 }
96}