use std::io::Read;
use crate::PseudoAln;
use crate::errors::CorruptedInputErr;
type E = Box<dyn std::error::Error>;
pub fn read_ahda_tsv<R: Read>(
conn: &mut R,
) -> Result<PseudoAln, E> {
let separator: char = '\t';
let mut contents: String = String::new();
conn.read_to_string(&mut contents)?;
let mut records = contents.split(separator);
let bytes = records.next().ok_or(CorruptedInputErr)?;
if bytes == "query_index" {
return Err(Box::new(crate::errors::AhdaTSVHeaderNotConsumedError{}))
}
let query_index = bytes.parse::<u32>()?;
let bytes = records.next().ok_or(CorruptedInputErr)?;
if bytes == "query_name" {
return Err(Box::new(crate::errors::AhdaTSVHeaderNotConsumedError{}))
}
let query_name = bytes.as_bytes().to_vec();
let mut ones: Vec<u32> = Vec::new();
for (idx, record) in records.enumerate() {
if record.parse::<u32>()? > 0 {
ones.push(idx as u32);
}
};
let res = PseudoAln{ones_names: None, query_id: Some(query_index), ones: Some(ones), query_name: Some(query_name)};
Ok(res)
}
#[cfg(test)]
mod tests {
#[test]
fn read_ahda_tsv_error_if_header_not_consumed() {
use super::read_ahda_tsv;
use std::io::BufRead;
use std::io::BufReader;
use std::io::Cursor;
let mut data: Vec<u8> = b"query_index\tquery_name\tchromosome.fasta\tplasmid.fasta\n".to_vec();
data.append(&mut b"0\tFastqQuery.1\t0\t0\n".to_vec());
data.append(&mut b"1\tFastqQuery.2\t0\t0\n".to_vec());
data.append(&mut b"2\tFastqQuery.3\t1\t0\n".to_vec());
data.append(&mut b"135608\tFastqQuery.135609\t1\t1\n".to_vec());
data.append(&mut b"100818\tFastqQuery.100819\t0\t1\n".to_vec());
let cursor = Cursor::new(data);
let mut reader = BufReader::new(cursor);
let mut line = String::new();
reader.read_line(&mut line).unwrap();
let got = read_ahda_tsv(&mut line.as_bytes());
assert!(got.is_err());
}
#[test]
fn read_ahda_tsv_multiple() {
use crate::PseudoAln;
use super::read_ahda_tsv;
use std::io::BufRead;
use std::io::BufReader;
use std::io::Cursor;
let mut data: Vec<u8> = b"query_index\tquery_name\tchromosome.fasta\tplasmid.fasta\n".to_vec();
data.append(&mut b"0\tFastqQuery.1\t0\t0\n".to_vec());
data.append(&mut b"1\tFastqQuery.2\t0\t0\n".to_vec());
data.append(&mut b"2\tFastqQuery.3\t1\t0\n".to_vec());
data.append(&mut b"135608\tFastqQuery.135609\t1\t1\n".to_vec());
data.append(&mut b"100818\tFastqQuery.100819\t0\t1\n".to_vec());
let expected = vec![
PseudoAln{ones_names: None, query_id: Some(0), ones: Some(vec![]), query_name: Some("FastqQuery.1".as_bytes().to_vec()) },
PseudoAln{ones_names: None, query_id: Some(1), ones: Some(vec![]), query_name: Some("FastqQuery.2".as_bytes().to_vec()) },
PseudoAln{ones_names: None, query_id: Some(2), ones: Some(vec![0]), query_name: Some("FastqQuery.3".as_bytes().to_vec()) },
PseudoAln{ones_names: None, query_id: Some(135608), ones: Some(vec![0, 1]), query_name: Some("FastqQuery.135609".as_bytes().to_vec()) },
PseudoAln{ones_names: None, query_id: Some(100818), ones: Some(vec![1]), query_name: Some("FastqQuery.100819".as_bytes().to_vec()) },
];
let cursor = Cursor::new(data);
let mut reader = BufReader::new(cursor);
reader.read_line(&mut String::new()).unwrap();
let got: Vec<PseudoAln> = reader.lines().map(|line| {
read_ahda_tsv(&mut line.unwrap().as_bytes()).unwrap()
}).collect();
assert_eq!(got, expected);
}
}