Skip to main content

bv_conformance/
inputs.rs

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
11// Multi-sequence variants for MSA tools (need ≥2 sequences).
12pub 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
19/// Write a `test://` URI to a file in `dest_dir` and return the path.
20pub 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
43/// Materialize all test inputs into `dest_dir`.
44pub 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}