scpi/parser/tokenizer/
token.rs

1use super::util;
2
3/// SCPI tokens
4/// Loosely based on IEEE488.2 Chapter 7
5///
6#[derive(Debug, PartialEq, Eq, Copy, Clone)]
7pub enum Token<'a> {
8    /// A header mnemonic separator `:`
9    HeaderMnemonicSeparator,
10    /// A header query suffix `?`
11    HeaderQuerySuffix,
12    /// A message unit separator `;`
13    ProgramMessageUnitSeparator,
14    /// A Program header separator ` `
15    ProgramHeaderSeparator,
16    /// A program data separator ','
17    ProgramDataSeparator,
18    /// A program mnemonic
19    ProgramMnemonic(&'a [u8]),
20    /// A <CHARACTER PROGRAM DATA> 7.7.1
21    CharacterProgramData(&'a [u8]),
22    /// A <DECIMAL NUMERIC PROGRAM DATA> 7.7.2
23    DecimalNumericProgramData(&'a [u8]),
24    /// A <DECIMAL NUMERIC PROGRAM DATA> 7.7.2 followed by a <SUFFIX PROGRAM DATA> 7.7.3
25    DecimalNumericSuffixProgramData(&'a [u8], &'a [u8]),
26    /// A <NONDECIMAL NUMERIC PROGRAM DATA> 7.7.4
27    NonDecimalNumericProgramData(u64),
28    /// A <STRING PROGRAM DATA> 7.7.5
29    StringProgramData(&'a [u8]),
30    /// A <ARBITRARY BLOCK PROGRAM DATA> 7.7.6
31    ArbitraryBlockData(&'a [u8]),
32    /// A <EXPRESSION PROGRAM DATA> 7.7.7
33    ExpressionProgramData(&'a [u8]),
34}
35
36impl<'a> Token<'a> {
37    pub fn is_data(&self) -> bool {
38        matches!(
39            self,
40            Self::CharacterProgramData(_)
41                | Self::DecimalNumericProgramData(_)
42                | Self::DecimalNumericSuffixProgramData(_, _)
43                | Self::NonDecimalNumericProgramData(_)
44                | Self::StringProgramData(_)
45                | Self::ArbitraryBlockData(_)
46                | Self::ExpressionProgramData(_)
47        )
48    }
49
50    /// Returns true if token is a ProgramMnemonic that matches provided mnemonic.
51    /// Header suffix is optional if equal to 1 or not present in mnemonic.
52    /// Header suffixes other than 1 must match exactly.
53    ///
54    /// Eg:
55    /// - `head[er]` == `HEADer`
56    /// - `head[er]1` == `HEADer`
57    /// - `head[er]` == `HEADer1`
58    /// - `head[er]<N>` == `HEADer<N>`
59    /// Where `[]` marks optional, `<>` required.
60    ///
61    pub fn match_program_header(&self, mnemonic: &'a [u8]) -> bool {
62        //Option<usize>
63        match self {
64            Token::ProgramMnemonic(s) | Token::CharacterProgramData(s) => {
65                util::mnemonic_match(mnemonic, s)
66            }
67            _ => false,
68        }
69    }
70}