use crate::device::ConnectedDevice;
use crate::samplerate::SampleRate;
use anyhow::Result;
use std::str::FromStr;
pub fn remove_ack(response: &str) -> String {
response
.trim_end_matches(char::from(0))
.trim_end_matches("\nACK")
.to_string()
}
pub fn verify_ack(response: &str) -> bool {
response.lines().last().unwrap() == "ACK"
}
pub fn parse_performance(response: &str) -> u8 {
response.parse::<u8>().unwrap()
}
pub fn parse_num_samples(response: &str) -> u32 {
response.parse::<u32>().unwrap()
}
pub fn parse_get_sample_rate(response: &str) -> SampleRate {
let mut iter = response.lines();
SampleRate {
DigitalSampleRate: iter.next().unwrap().parse::<u32>().unwrap(),
AnalogSampleRate: iter.next().unwrap().parse::<u32>().unwrap(),
}
}
pub fn parse_get_all_sample_rates(response: &str) -> Vec<SampleRate> {
response
.lines()
.map(|a| SampleRate::from_str(a).unwrap())
.collect()
}
pub fn parse_connected_devices(response: &str) -> Vec<ConnectedDevice> {
response
.lines()
.map(|a| ConnectedDevice::from_str(a).unwrap())
.collect()
}
pub fn parse_get_active_channels(response: &str) -> Result<Vec<Vec<u8>>> {
println!("{}", response);
let v: Vec<&str> = response.split(',').map(str::trim_start).collect();
let digital_pos = v.iter().position(|a| *a == "digital_channels").unwrap();
let analog_pos = v.iter().position(|a| *a == "analog_channels").unwrap();
let digital_res: Vec<u8> = v[digital_pos + 1..analog_pos]
.iter()
.map(|a| a.parse().unwrap())
.collect();
let analog_res: Vec<u8> = v[analog_pos + 1..v.len()]
.iter()
.map(|a| a.parse().unwrap())
.collect();
Ok(vec![digital_res, analog_res])
}
pub fn parse_processing_complete(response: &str) -> bool {
response == "TRUE"
}