Skip to main content

use_bioinformatics/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4pub use use_alignment as alignment;
5pub use use_alphabet as alphabet;
6pub use use_amino_acid as amino_acid;
7pub use use_annotation as annotation;
8pub use use_feature as feature;
9pub use use_genomic_range as genomic_range;
10pub use use_motif as motif;
11pub use use_nucleotide as nucleotide;
12pub use use_residue as residue;
13pub use use_sequence as sequence;
14pub use use_sequence_id as sequence_id;
15
16/// Common primitive bioinformatics vocabulary reexports.
17pub mod prelude {
18    pub use use_alignment::{
19        AlignedSequence, AlignmentId, AlignmentKind, AlignmentScore, AlignmentSummary,
20        AlignmentValueError,
21    };
22    pub use use_alphabet::{AlphabetError, AlphabetKind, AlphabetSymbolSet, BioAlphabet};
23    pub use use_amino_acid::{AminoAcid, AminoAcidCode, AminoAcidKind, AminoAcidParseError};
24    pub use use_annotation::{
25        Annotation, AnnotationKey, AnnotationKeyError, AnnotationSet, AnnotationValue,
26    };
27    pub use use_feature::{
28        FeatureId, FeatureKind, FeatureName, FeatureValueError, SequenceFeature,
29    };
30    pub use use_genomic_range::{
31        CoordinateSystem, GenomicPosition, GenomicRange, GenomicRangeError, Strand,
32    };
33    pub use use_motif::{MotifHit, MotifKind, MotifName, MotifPattern, MotifValueError};
34    pub use use_nucleotide::{
35        Nucleotide, NucleotideKind, NucleotideParseError, NucleotideSequenceKind,
36    };
37    pub use use_residue::{Residue, ResidueError, ResidueKind, ResidueSymbol};
38    pub use use_sequence::{
39        BioSequence, SequenceError, SequenceKind, SequenceLength, SequenceText,
40    };
41    pub use use_sequence_id::{
42        Accession, SequenceId, SequenceIdError, SequenceSource, VersionedAccession,
43    };
44}
45
46#[cfg(test)]
47mod tests {
48    use super::prelude::{
49        Accession, AlignedSequence, Annotation, AnnotationKey, AnnotationSet, AnnotationValue,
50        BioAlphabet, BioSequence, FeatureKind, FeatureName, GenomicPosition, GenomicRange,
51        MotifHit, MotifKind, MotifName, MotifPattern, Nucleotide, SequenceFeature, SequenceKind,
52    };
53
54    #[test]
55    fn facade_composes_bioinformatics_primitives_without_analysis() {
56        let sequence = BioSequence::new(SequenceKind::Dna, "ACGTN").expect("valid sequence");
57        let residue = Nucleotide::parse_symbol('A').expect("valid nucleotide");
58        let dna = BioAlphabet::dna();
59        let range = GenomicRange::new(GenomicPosition::new(10), GenomicPosition::new(15))
60            .expect("valid range");
61        let feature = SequenceFeature::new(
62            FeatureKind::Gene,
63            FeatureName::new("BRCA1 region").expect("valid feature name"),
64        )
65        .with_range(range.clone());
66        let annotation = Annotation::new(
67            AnnotationKey::new("source").expect("valid annotation key"),
68            AnnotationValue::new("curated example"),
69        );
70        let mut annotations = AnnotationSet::new();
71        annotations.insert(annotation);
72        let motif = MotifHit::new(
73            MotifName::new("TATA box").expect("valid motif name"),
74            MotifPattern::new("TATA").expect("valid motif pattern"),
75            MotifKind::Dna,
76        );
77        let aligned = AlignedSequence::new("ACG-TN").expect("valid aligned sequence");
78        let accession = Accession::new("NM_007294").expect("valid accession");
79
80        assert_eq!(sequence.as_str(), "ACGTN");
81        assert_eq!(residue.to_string(), "A");
82        assert!(dna.contains('A'));
83        assert_eq!(feature.range(), Some(&range));
84        assert_eq!(
85            annotations
86                .get("source")
87                .expect("stored annotation")
88                .as_str(),
89            "curated example"
90        );
91        assert_eq!(motif.pattern().as_str(), "TATA");
92        assert_eq!(aligned.aligned_len(), 6);
93        assert_eq!(accession.to_string(), "NM_007294");
94    }
95}