use crate::{
hatanaka::decompressor::DecompressorExpert,
prelude::{Constellation, Observable},
};
use std::io::{BufRead, BufReader, Lines, Read};
pub type DecompressorIO<R> = DecompressorExpertIO<5, R>;
pub struct DecompressorExpertIO<const M: usize, R: Read> {
lines: Lines<BufReader<R>>,
decomp: DecompressorExpert<M>,
}
impl<const M: usize, R: Read> Read for DecompressorExpertIO<M, R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
if let Some(line) = self.lines.next() {
let line = line?;
let len = line.len();
let buf_size = buf.len();
let size = self
.decomp
.decompress(&line, len, buf, buf_size)
.map_err(|_| std::io::Error::new(std::io::ErrorKind::Other, "hatanaka error"))?;
Ok(size)
} else {
Ok(0)
}
}
}
impl<const M: usize, R: Read> DecompressorExpertIO<M, R> {
pub fn from_read(reader: R) -> Self {
Self {
lines: BufReader::new(reader).lines(),
decomp: DecompressorExpert::<M>::default(),
}
}
pub fn from_bufread(reader: BufReader<R>) -> Self {
Self {
lines: reader.lines(),
decomp: DecompressorExpert::<M>::default(),
}
}
pub fn with_observables(&mut self, constell: Constellation, observables: Vec<Observable>) {
self.decomp.gnss_observables.insert(constell, observables);
}
}