1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use crate::domain::{
    dtos::blast_builder::BlastBuilder,
    entities::execute_step::{ExecuteStep, ExecutionResponse},
};
use clean_base::utils::errors::{execution_err, MappedErrors};
use subprocess::{Exec, Redirection};

pub struct ExecuteStepProcRepository {}

impl ExecuteStep for ExecuteStepProcRepository {
    fn run(
        &self,
        query_sequences: String,
        blast_config: BlastBuilder,
    ) -> Result<ExecutionResponse, MappedErrors> {
        let blast_response = match Exec::cmd("blastn")
            .stdin(&*query_sequences)
            .arg("-subject")
            .arg(&blast_config.subject_reads)
            .arg("-outfmt")
            .arg(&blast_config.out_format)
            .arg("-max_target_seqs")
            .arg("10")
            .stdout(Redirection::Pipe)
            .stderr(Redirection::Pipe)
            .capture()
        {
            Err(err) => {
                return Err(execution_err(
                    format!(
                        "Unexpected error detected on execute blast: {err}"
                    ),
                    None,
                    None,
                ))
            }
            Ok(res) => res,
        };

        if !blast_response.success() {
            return Ok(ExecutionResponse::Fail(blast_response.stderr_str()));
        }

        Ok(ExecutionResponse::Success(blast_response.stdout_str()))
    }
}