bio_seq/codec/
amino.rs

1//! 6-bit representation of amino acids
2//!
3//! A `Seq<Dna>` sequence of length 3 can be read as an amino acid
4//! sequence in place.
5use crate::codec::Codec;
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Codec)]
8#[bits(6)]
9#[repr(u8)]
10pub enum Amino {
11    #[alt(0b11_01_10, 0b01_01_10, 0b10_01_10)]
12    A = 0b00_01_10, // GCA
13    #[alt(0b11_10_11)]
14    C = 0b01_10_11, // TGC
15    #[alt(0b11_00_10)]
16    D = 0b01_00_10, // GAC
17    #[alt(0b10_00_10)]
18    E = 0b00_00_10, // GAA
19    #[alt(0b11_11_11)]
20    F = 0b01_11_11, // TTC
21    #[alt(0b10_10_10, 0b01_10_10, 0b11_10_10)]
22    G = 0b00_10_10, // GGA
23    #[alt(0b11_00_01)]
24    H = 0b01_00_01, // CAC
25    #[alt(0b01_11_00, 0b11_11_00)]
26    I = 0b00_11_00, // ATA
27    #[alt(0b10_00_00)]
28    K = 0b00_00_00, // AAA
29    #[alt(0b00_11_11, 0b10_11_11, 0b11_11_01, 0b01_11_01, 0b10_11_01)]
30    L = 0b00_11_01, // CTA
31    M = 0b10_11_00, // ATG
32    #[alt(0b11_00_00)]
33    N = 0b01_00_00, // AAC
34    #[alt(0b01_01_01, 0b10_01_01, 0b11_01_01)]
35    P = 0b00_01_01, // CCA
36    #[alt(0b10_00_01)]
37    Q = 0b00_00_01, // CAA
38    #[alt(0b10_10_00, 0b11_10_01, 0b01_10_01, 0b00_10_01, 0b10_10_01)]
39    R = 0b00_10_00, // AGA
40    #[alt(0b11_01_11, 0b01_01_11, 0b00_01_11, 0b10_01_11, 0b11_10_00)]
41    S = 0b01_10_00, // AGC
42    #[alt(0b11_01_00, 0b01_01_00, 0b10_01_00)]
43    T = 0b00_01_00, // ACA
44    #[alt(0b01_11_10, 0b11_11_10, 0b10_11_10)]
45    V = 0b00_11_10, // GTA
46    W = 0b10_10_11, // TGG
47    #[alt(0b11_00_11)]
48    Y = 0b01_00_11, // TAC
49    #[display('*')]
50    #[alt(0b00_10_11, 0b10_00_11)]
51    X = 0b00_00_11, // TAA (stop)
52}
53
54impl From<Amino> for u8 {
55    fn from(b: Amino) -> u8 {
56        b as u8
57    }
58}
59
60impl core::fmt::Display for Amino {
61    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
62        write!(f, "{}", self.to_char())
63    }
64}