ptouch_rs/command/
status.rs

1use 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}