defmt_parser/
types.rs

1use std::{ops::Range, str::FromStr};
2
3#[derive(Clone, Debug, Default, Eq, PartialEq)]
4pub enum Type {
5    BitField(Range<u8>),
6    Bool,
7    /// A single Unicode character
8    Char,
9
10    Debug,
11    Display,
12    FormatSequence,
13
14    F32,
15    F64,
16
17    /// `{=?}` OR `{}`
18    #[default] // when not specified in the format string, this type is assumed
19    Format,
20    FormatArray(usize), // FIXME: This `usize` is not the target's `usize`; use `u64` instead?
21    /// `{=[?]}`
22    FormatSlice,
23
24    I8,
25    I16,
26    I32,
27    I64,
28    I128,
29    Isize,
30
31    /// Interned string index.
32    IStr,
33    /// String slice (i.e. passed directly; not as interned string indices).
34    Str,
35
36    U8,
37    U16,
38    U32,
39    U64,
40    U128,
41    Usize,
42
43    /// Byte slice `{=[u8]}`.
44    U8Slice,
45    U8Array(usize), // FIXME: This `usize` is not the target's `usize`; use `u64` instead?
46}
47
48// FIXME: either all or none of the type parsing should be done in here
49impl FromStr for Type {
50    type Err = ();
51
52    fn from_str(s: &str) -> Result<Self, Self::Err> {
53        Ok(match s {
54            "u8" => Type::U8,
55            "u16" => Type::U16,
56            "u32" => Type::U32,
57            "u64" => Type::U64,
58            "u128" => Type::U128,
59            "usize" => Type::Usize,
60            "i8" => Type::I8,
61            "i16" => Type::I16,
62            "i32" => Type::I32,
63            "i64" => Type::I64,
64            "i128" => Type::I128,
65            "isize" => Type::Isize,
66            "f32" => Type::F32,
67            "f64" => Type::F64,
68            "bool" => Type::Bool,
69            "str" => Type::Str,
70            "istr" => Type::IStr,
71            "__internal_Debug" => Type::Debug,
72            "__internal_Display" => Type::Display,
73            "__internal_FormatSequence" => Type::FormatSequence,
74            "[u8]" => Type::U8Slice,
75            "?" => Type::Format,
76            "[?]" => Type::FormatSlice,
77            "char" => Type::Char,
78            _ => return Err(()),
79        })
80    }
81}