use at_parser_rs::context::AtContext;
use at_parser_rs::{Args, AtError, AtResult};
pub struct EchoModule {
pub echo: bool,
}
impl AtContext for EchoModule {
fn exec(&self) -> AtResult<'static> {
if self.echo {
Ok("ECHO: ON")
} else {
Ok("ECHO: OFF")
}
}
fn query(&mut self) -> AtResult<'static> {
if self.echo {
Ok("1")
} else {
Ok("0")
}
}
fn test(&mut self) -> AtResult<'static> {
Ok("Valid values: 0 (OFF), 1 (ON)")
}
fn set(&mut self, args: Args) -> AtResult<'static> {
let value = args.get(0).ok_or(AtError::InvalidArgs)?;
match value {
"0" => {
self.echo = false;
Ok("ECHO OFF")
}
"1" => {
self.echo = true;
Ok("ECHO ON")
}
_ => Err(AtError::InvalidArgs),
}
}
}
pub struct ResetModule;
impl AtContext for ResetModule {
fn exec(&self) -> AtResult<'static> {
println!(" [System reset triggered]");
Ok("OK - System reset")
}
fn test(&mut self) -> AtResult<'static> {
Ok("Reset the system")
}
}
pub struct InfoModule {
pub version: &'static str,
}
impl AtContext for InfoModule {
fn exec(&self) -> AtResult<'static> {
Ok(self.version)
}
fn query(&mut self) -> AtResult<'static> {
Ok("AT-Parser-RS v1.0.0 - AT Command Parser Library")
}
}
pub struct LedModule {
pub state: bool,
pub brightness: u8,
}
impl AtContext for LedModule {
fn exec(&self) -> AtResult<'static> {
if self.state {
Ok("LED: ON")
} else {
Ok("LED: OFF")
}
}
fn query(&mut self) -> AtResult<'static> {
if self.state {
Ok("1,100")
} else {
Ok("0,0")
}
}
fn test(&mut self) -> AtResult<'static> {
Ok("AT+LED=<state>,<brightness> where state: 0|1, brightness: 0-100")
}
fn set(&mut self, args: Args) -> AtResult<'static> {
let state_str = args.get(0).ok_or(AtError::InvalidArgs)?;
self.state = match state_str {
"0" => false,
"1" => true,
_ => return Err(AtError::InvalidArgs),
};
if let Some(brightness_str) = args.get(1) {
self.brightness = brightness_str
.parse::<u8>()
.map_err(|_| AtError::InvalidArgs)?;
if self.brightness > 100 {
return Err(AtError::InvalidArgs);
}
}
if self.state {
Ok("LED ON")
} else {
Ok("LED OFF")
}
}
}
fn execute_command(cmd: &str, name: &str, module: &mut dyn AtContext) {
println!("\n> {}", cmd);
let result = if let Some(rest) = cmd.strip_prefix(name) {
if rest.is_empty() {
module.exec()
} else if rest == "?" {
module.query()
} else if rest == "=?" {
module.test()
} else if let Some(args_str) = rest.strip_prefix('=') {
module.set(Args { raw: args_str })
} else {
Err(AtError::InvalidArgs)
}
} else {
Err(AtError::UnknownCommand)
};
match result {
Ok(response) => println!(" Response: {}", response),
Err(AtError::UnknownCommand) => println!(" Error: Unknown command"),
Err(AtError::NotSupported) => println!(" Error: Operation not supported"),
Err(AtError::InvalidArgs) => println!(" Error: Invalid arguments"),
}
}
fn main() {
println!("=== AT Command Parser Example ===\n");
println!("Available commands: AT+ECHO, AT+RST, AT+INFO, AT+LED\n");
let mut echo = EchoModule { echo: false };
let mut reset = ResetModule;
let mut info = InfoModule { version: "v1.0.0" };
let mut led = LedModule {
state: false,
brightness: 0,
};
println!("--- INFO Command ---");
execute_command("AT+INFO", "AT+INFO", &mut info); execute_command("AT+INFO?", "AT+INFO", &mut info);
println!("\n--- ECHO Command ---");
execute_command("AT+ECHO", "AT+ECHO", &mut echo); execute_command("AT+ECHO=?", "AT+ECHO", &mut echo); execute_command("AT+ECHO=1", "AT+ECHO", &mut echo); execute_command("AT+ECHO?", "AT+ECHO", &mut echo); execute_command("AT+ECHO", "AT+ECHO", &mut echo); execute_command("AT+ECHO=0", "AT+ECHO", &mut echo); execute_command("AT+ECHO", "AT+ECHO", &mut echo);
println!("\n--- LED Command ---");
execute_command("AT+LED=?", "AT+LED", &mut led); execute_command("AT+LED=1", "AT+LED", &mut led); execute_command("AT+LED?", "AT+LED", &mut led); execute_command("AT+LED=1,75", "AT+LED", &mut led); execute_command("AT+LED", "AT+LED", &mut led); execute_command("AT+LED=0", "AT+LED", &mut led);
println!("\n--- RESET Command ---");
execute_command("AT+RST=?", "AT+RST", &mut reset); execute_command("AT+RST", "AT+RST", &mut reset);
println!("\n--- Error Handling ---");
execute_command("AT+ECHO=2", "AT+ECHO", &mut echo); execute_command("AT+INFO=1", "AT+INFO", &mut info);
println!("\n=== Example completed ===");
}