basic_parser/
basic_parser.rs1#![no_std]
27#![no_main]
28#![allow(dead_code, unused_variables)]
29
30extern crate at_parser_rs;
31
32use at_parser_rs::context::AtContext;
33use at_parser_rs::parser::AtParser;
34use at_parser_rs::{Args, AtError, AtResult, at_response};
35
36const SIZE: usize = 64;
37
38pub struct TestCommand {
40 pub value: u32,
41}
42
43impl AtContext<SIZE> for TestCommand {
44 fn exec(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
45 Ok(at_response!(SIZE, at_response; "executed"))
46 }
47
48 fn query(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
49 Ok(at_response!(SIZE, at_response; self.value))
50 }
51
52 fn test(&mut self, at_response: &'static str) -> AtResult<'_, SIZE> {
53 Ok(at_response!(SIZE, at_response; "(0-100)"))
54 }
55
56 fn set(&mut self, at_response: &'static str, args: Args) -> AtResult<'_, SIZE> {
57 let val_str = args.get(0).ok_or((at_response, AtError::InvalidArgs))?;
58 self.value = val_str.parse().map_err(|_| (at_response, AtError::InvalidArgs))?;
59 Ok(at_response!(SIZE, at_response; "OK"))
60 }
61}
62
63#[unsafe(no_mangle)]
64pub extern "C" fn main() -> ! {
65 let mut cmd1 = TestCommand { value: 0 };
66 let mut cmd2 = TestCommand { value: 5 };
67 let mut cmd3 = TestCommand { value: 10 };
68
69 let mut parser: AtParser<TestCommand, SIZE> = AtParser::new();
70
71 let commands: &mut [(&str, &str, &mut TestCommand)] = &mut [
72 ("AT+CMD1", "+CMD1: ", &mut cmd1),
73 ("AT+CMD2", "+CMD2: ", &mut cmd2),
74 ("AT+CMD3", "+CMD3: ", &mut cmd3),
75 ];
76 parser.set_commands(commands);
77
78 let _ = parser.execute("AT+CMD1"); let _ = parser.execute("AT+CMD1?"); let _ = parser.execute("AT+CMD1=?"); let _ = parser.execute("AT+CMD1=42"); let _ = parser.execute("AT+CMD1?"); let _ = parser.execute("AT+CMD2"); let _ = parser.execute("AT+CMD2?"); let _ = parser.execute("AT+CMD3=100"); let _ = parser.execute("AT+CMD3?"); let _ = parser.execute("AT+UNKNOWN"); let _ = parser.execute("AT+CMD1=abc"); loop {}
91}
92