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}