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
47
48
49
50
51
52
53
//! For opening the browser to NCBI BLAST, PDB etc.
//!
//! PDB Search API: https://search.rcsb.org/#search-api
//! PDB Data API: https://data.rcsb.org/#data-api
use bio_apis::ncbi;
use crate::{Selection, state::State};
/// BLAST the selected Feature, primer, or selection. Prioritize the selection.
/// This function handles extracting the sequence to BLAST from possible selections.
pub fn blast(state: &State) {
let data = &state.generic[state.active];
let val = match state.ui.text_selection {
Some(sel) => {
// Don't format sel directly, as we insert the bp count downstream for use with feature selections.
Some((
sel.index_seq(&data.seq),
format!("{}, {}..{}", data.metadata.plasmid_name, sel.start, sel.end),
))
}
None => match state.ui.selected_item {
Selection::Feature(feat_i) => {
if feat_i >= data.features.len() {
eprintln!("Invalid selected feature");
None
} else {
let feature = &data.features[feat_i];
Some((feature.range.index_seq(&data.seq), feature.label.clone()))
}
}
Selection::Primer(prim_i) => {
if prim_i >= data.primers.len() {
eprintln!("Invalid selected primer");
None
} else {
let primer = &data.primers[prim_i];
Some((Some(&primer.sequence[..]), primer.name.clone()))
}
}
Selection::None => None,
},
};
// todo: Handle reverse.
if let Some((seq, name)) = val {
if let Some(s) = seq {
ncbi::open_blast(s, &name);
}
}
}