use_bioinformatics/
lib.rs1#![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
16pub 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}