liblora 0.1.1

A library to handle LoRa UART functionality
Documentation
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())
    }
}