1use super::{
4 alphabet::{BCRYPT_ALPHABET, CRYPT_ALPHABET, IMAP_MUTF7_ALPHABET, PBKDF2_ALPHABET},
5 specifications::{
6 Base64, DecodePadding, EncodePadding, RuntimeSpec, STRICT_STANDARD_PADDED,
7 StrictStandardPadded, TrailingBits, runtime_codec,
8 },
9 wrapping::LineWrap,
10};
11
12#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
17pub struct BodyCodec<S> {
18 codec: Base64<S>,
19 wrapping: LineWrap,
20}
21
22impl<S> BodyCodec<S> {
23 const fn new(codec: Base64<S>, wrapping: LineWrap) -> Self {
24 Self { codec, wrapping }
25 }
26
27 #[must_use]
29 pub const fn codec(&self) -> &Base64<S> {
30 &self.codec
31 }
32
33 #[must_use]
35 pub const fn wrapping(&self) -> LineWrap {
36 self.wrapping
37 }
38}
39
40pub const MIME_BODY_STRICT: BodyCodec<StrictStandardPadded> =
44 BodyCodec::new(STRICT_STANDARD_PADDED, LineWrap::MIME_BODY_WRAP);
45
46pub const PEM_BODY_LF: BodyCodec<StrictStandardPadded> =
50 BodyCodec::new(STRICT_STANDARD_PADDED, LineWrap::PEM_BODY_LF_WRAP);
51
52pub const PEM_BODY_CRLF: BodyCodec<StrictStandardPadded> =
56 BodyCodec::new(STRICT_STANDARD_PADDED, LineWrap::PEM_BODY_CRLF_WRAP);
57
58pub const BCRYPT_ALPHABET_NO_PAD: Base64<RuntimeSpec> = runtime_codec(
62 BCRYPT_ALPHABET,
63 EncodePadding::Unpadded,
64 DecodePadding::Forbid,
65 TrailingBits::RequireCanonical,
66);
67
68pub const CRYPT_ALPHABET_NO_PAD: Base64<RuntimeSpec> = runtime_codec(
73 CRYPT_ALPHABET,
74 EncodePadding::Unpadded,
75 DecodePadding::Forbid,
76 TrailingBits::RequireCanonical,
77);
78
79pub const PBKDF2_ALPHABET_NO_PAD: Base64<RuntimeSpec> = runtime_codec(
84 PBKDF2_ALPHABET,
85 EncodePadding::Unpadded,
86 DecodePadding::Forbid,
87 TrailingBits::RequireCanonical,
88);
89
90pub const IMAP_MUTF7_ALPHABET_NO_PAD: Base64<RuntimeSpec> = runtime_codec(
95 IMAP_MUTF7_ALPHABET,
96 EncodePadding::Unpadded,
97 DecodePadding::Forbid,
98 TrailingBits::RequireCanonical,
99);