1use std::collections::HashMap;
2use std::path::{Path, PathBuf};
3
4use anyhow::Context;
5
6pub const FASTA_PROTEIN: &str = ">sp|TEST|test_protein Test protein OS=Homo sapiens\nMKTAYIAKQRQISFVKSHFSRQLEDAFQSENEHSFVKKLIENKLEKLNAK\n";
7pub const FASTA_NUCLEOTIDE: &str =
8 ">test_seq Test nucleotide sequence\nATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGAT\n";
9pub const FASTQ: &str = "@read1\nATCGATCGATCGATCG\n+\nIIIIIIIIIIIIIIII\n@read2\nGCTAGCTAGCTAGCTA\n+\nIIIIIIIIIIIIIIII\n";
10
11pub const FASTA_PROTEIN_MULTI: &str = ">sp|TEST1|prot1\nMKTAYIAKQRQISFVKSHFSRQLEDAFQSENEHSFVKKLIENKLEKLNAK\n\
13>sp|TEST2|prot2\nMKTAAIAKQRQISFVKSHFSRQLEDAFQSENEHSFVKKLIENKLEELNAK\n\
14>sp|TEST3|prot3\nMKTAYIAKQRQISFVKAHFSRQLEDAFQAENEHSFVKKLIENKLEKLNAK\n";
15pub const FASTA_NUCLEOTIDE_MULTI: &str = ">seq1\nATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGAT\n\
16>seq2\nATCGATCGATCGATCGATCGATCCATCGATCGATCGATCGATCGATCGAT\n\
17>seq3\nATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCGATCCAT\n";
18
19pub fn materialize(uri: &str, dest_dir: &Path) -> anyhow::Result<PathBuf> {
21 let rest = uri
22 .strip_prefix("test://")
23 .ok_or_else(|| anyhow::anyhow!("expected a test:// URI, got '{}'", uri))?;
24
25 let (content, filename) = match rest {
26 "fasta-protein" => (FASTA_PROTEIN, "input.fasta"),
27 "fasta-nucleotide" => (FASTA_NUCLEOTIDE, "input.fasta"),
28 "fasta-protein-multi" => (FASTA_PROTEIN_MULTI, "input_multi.fasta"),
29 "fasta-nucleotide-multi" => (FASTA_NUCLEOTIDE_MULTI, "input_multi.fasta"),
30 "fastq" => (FASTQ, "input.fastq"),
31 other => anyhow::bail!(
32 "unknown test input '{}'; add it to bv-conformance/src/inputs.rs",
33 other
34 ),
35 };
36
37 let path = dest_dir.join(filename);
38 std::fs::write(&path, content)
39 .with_context(|| format!("failed to write test input to {}", path.display()))?;
40 Ok(path)
41}
42
43pub fn materialize_all(
45 inputs: &HashMap<String, String>,
46 dest_dir: &Path,
47) -> anyhow::Result<HashMap<String, PathBuf>> {
48 inputs
49 .iter()
50 .map(|(port_name, uri)| {
51 let path = materialize(uri, dest_dir)?;
52 Ok((port_name.clone(), path))
53 })
54 .collect()
55}