use std::str;
use std::str::FromStr;
use crate::error::LoRaError as Lerr;
use crate::Transfer;
#[derive(Debug, Default, Clone)]
pub struct Rcv {
pub addr: u16,
pub len: u16,
pub data: String,
pub rssi: i16,
pub snr: u16,
}
impl TryFrom<&str> for Rcv {
type Error = Lerr;
fn try_from(mut i: &str) -> Result<Self, Lerr> {
let mut rcv = Self::default();
if i[..5] == *"+RCV=" {
i = &i[5..];
}
if let Some((addr, rest)) = i.split_once(',') {
rcv.addr = u16::from_str(addr)?;
if let Some((len, rest)) = rest.split_once(',') {
rcv.len = u16::from_str(len)?;
if let Some((rest, snr)) = rest.rsplit_once(',') {
if let Some((snr, _)) = snr.split_once('\r') {
rcv.snr = u16::from_str(snr)?;
}
if let Some((data, rssi)) = rest.rsplit_once(',') {
rcv.rssi = i16::from_str(rssi)?;
rcv.data = data.to_string();
}
}
}
}
Ok(rcv)
}
}
impl Rcv {
pub fn fmt(&self) -> String {
format!("FromAddr: {} Msg: \"{}\"", self.addr, self.data)
}
pub fn fmt_extended(&self) -> String {
format!(
"FromAddr: {} MsgLen: {} Msg: \"{}\" RSSI: {} SNR: {}",
self.addr, self.len, self.data, self.rssi, self.snr
)
}
}
impl TryFrom<&Rcv> for Transfer {
type Error = Lerr;
fn try_from(i: &Rcv) -> Result<Transfer, Lerr> {
Transfer::try_from(i.data.clone())
}
}