use std::io::Read;
use crate::PseudoAln;
type E = Box<dyn std::error::Error>;
pub fn read_metagraph<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 query_id: u32 = match records.next() {
Some(id_str) => id_str.parse::<u32>()?,
None => return Err(Box::new(crate::errors::CorruptedInputErr{})),
};
let query_name = match records.next() {
Some(name) => name.as_bytes().to_vec(),
None => return Err(Box::new(crate::errors::CorruptedInputErr{})),
};
let mut ones_names: Vec<Vec<u8>> = Vec::new();
let ones_records = match records.next() {
Some(targets) => targets.split(':'),
None => return Err(Box::new(crate::errors::CorruptedInputErr{})),
};
for record in ones_records {
if !record.is_empty() {
ones_names.push(record.as_bytes().to_vec());
}
};
let res = PseudoAln{ ones_names: Some(ones_names), query_id: Some(query_id), ones: None, query_name: Some(query_name)};
Ok(res)
}
#[cfg(test)]
mod tests {
#[test]
fn read_metagraph_multiple() {
use crate::PseudoAln;
use super::read_metagraph;
use std::io::BufRead;
use std::io::BufReader;
use std::io::Cursor;
let mut data: Vec<u8> = b"3\tERR4035126.2\tchr.fasta\n".to_vec();
data.append(&mut b"2\tERR4035126.1\tchr.fasta\n".to_vec());
data.append(&mut b"1303804\tERR4035126.651903\tchr.fasta:plasmid.fasta\n".to_vec());
data.append(&mut b"30\tERR4035126.16\t\n".to_vec());
data.append(&mut b"15084\tERR4035126.7543\tplasmid.fasta\n".to_vec());
let expected = vec![
PseudoAln{ones_names: Some(vec!["chr.fasta".as_bytes().to_vec()]), query_id: Some(3), ones: None, query_name: Some("ERR4035126.2".as_bytes().to_vec()) },
PseudoAln{ones_names: Some(vec!["chr.fasta".as_bytes().to_vec()]), query_id: Some(2), ones: None, query_name: Some("ERR4035126.1".as_bytes().to_vec()) },
PseudoAln{ones_names: Some(vec!["chr.fasta".as_bytes().to_vec(), "plasmid.fasta".as_bytes().to_vec()]), query_id: Some(1303804), ones: None, query_name: Some("ERR4035126.651903".as_bytes().to_vec()) },
PseudoAln{ones_names: Some(vec![]), query_id: Some(30), ones: None, query_name: Some("ERR4035126.16".as_bytes().to_vec()) },
PseudoAln{ones_names: Some(vec!["plasmid.fasta".as_bytes().to_vec()]), query_id: Some(15084), ones: None, query_name: Some("ERR4035126.7543".as_bytes().to_vec()) },
];
let cursor = Cursor::new(data);
let reader = BufReader::new(cursor);
let got: Vec<PseudoAln> = reader.lines().map(|line| {
read_metagraph(&mut line.unwrap().as_bytes()).unwrap()
}).collect();
assert_eq!(got, expected);
}
}