use std::io::Read;
use crate::PseudoAln;
use crate::errors::CorruptedInputErr;
type E = Box<dyn std::error::Error>;
pub fn read_themisto<R: Read>(
conn: &mut R,
) -> Result<PseudoAln, E> {
let separator: char = ' ';
let mut contents: String = String::new();
conn.read_to_string(&mut contents)?;
let mut records = contents.split(separator);
let id_bytes = records.next().ok_or(CorruptedInputErr)?;
let read_id = id_bytes.parse::<u32>()?;
let mut ones: Vec<u32> = Vec::new();
for record in records {
let id = record.parse::<u32>()?;
ones.push(id);
}
let res = PseudoAln{ones_names: None, query_id: Some(read_id), ones: Some(ones), ..Default::default()};
Ok(res)
}
#[cfg(test)]
mod tests {
#[test]
fn read_themisto_line_multiple_aligned() {
use std::io::Cursor;
use crate::PseudoAln;
use super::read_themisto;
let data: Vec<u8> = b"128 0 7 11 3".to_vec();
let expected = PseudoAln{ones_names: None, query_id: Some(128), ones: Some(vec![0, 7, 11, 3]), ..Default::default()};
let mut input: Cursor<Vec<u8>> = Cursor::new(data);
let got = read_themisto(&mut input).unwrap();
assert_eq!(got, expected);
}
#[test]
fn read_themisto_line_empty() {
use std::io::Cursor;
use crate::PseudoAln;
use super::read_themisto;
let data: Vec<u8> = b"185216".to_vec();
let expected = PseudoAln{ones_names: None, query_id: Some(185216), ones: Some(Vec::new()), ..Default::default()};
let mut input: Cursor<Vec<u8>> = Cursor::new(data);
let got = read_themisto(&mut input).unwrap();
assert_eq!(got, expected);
}
#[test]
fn read_themisto_multiple() {
use crate::PseudoAln;
use super::read_themisto;
use std::io::BufRead;
use std::io::BufReader;
use std::io::Cursor;
let data: Vec<u8> = b"185216\n188352\n202678 1\n202728\n651964 0 1\n651966 0 1\n1166624 0\n1166625 0\n1166626 1".to_vec();
let expected = vec![
PseudoAln{ones_names: None, query_id: Some(185216), ones: Some(vec![]), ..Default::default()},
PseudoAln{ones_names: None, query_id: Some(188352), ones: Some(vec![]), ..Default::default()},
PseudoAln{ones_names: None, query_id: Some(202678), ones: Some(vec![1]), ..Default::default()},
PseudoAln{ones_names: None, query_id: Some(202728), ones: Some(vec![]), ..Default::default()},
PseudoAln{ones_names: None, query_id: Some(651964), ones: Some(vec![0, 1]), ..Default::default()},
PseudoAln{ones_names: None, query_id: Some(651966), ones: Some(vec![0, 1]), ..Default::default()},
PseudoAln{ones_names: None, query_id: Some(1166624), ones: Some(vec![0]), ..Default::default()},
PseudoAln{ones_names: None, query_id: Some(1166625), ones: Some(vec![0]), ..Default::default()},
PseudoAln{ones_names: None, query_id: Some(1166626), ones: Some(vec![1]), ..Default::default()},
];
let cursor = Cursor::new(data);
let reader = BufReader::new(cursor);
let got: Vec<PseudoAln> = reader.lines().map(|line| {
read_themisto(&mut line.unwrap().as_bytes()).unwrap()
}).collect();
assert_eq!(got, expected);
}
}