Skip to main content

mini_mail_auth/dkim/
builder.rs

1use super::{Canonicalization, DkimSigner, Done, NeedDomain, NeedHeaders, NeedSelector};
2use crate::common::crypto::SigningKey;
3
4impl<T: SigningKey> DkimSigner<T> {
5    pub fn from_key(key: T) -> DkimSigner<T, NeedDomain> {
6        DkimSigner {
7            _state: Default::default(),
8            template: super::Signature {
9                v: 1,
10                a: key.algorithm(),
11                ..Default::default()
12            },
13            key,
14        }
15    }
16}
17
18impl<T: SigningKey> DkimSigner<T, NeedDomain> {
19    pub fn domain(mut self, domain: impl Into<String>) -> DkimSigner<T, NeedSelector> {
20        self.template.d = domain.into();
21        DkimSigner {
22            _state: Default::default(),
23            key: self.key,
24            template: self.template,
25        }
26    }
27}
28
29impl<T: SigningKey> DkimSigner<T, NeedSelector> {
30    pub fn selector(mut self, selector: impl Into<String>) -> DkimSigner<T, NeedHeaders> {
31        self.template.s = selector.into();
32        DkimSigner {
33            _state: Default::default(),
34            key: self.key,
35            template: self.template,
36        }
37    }
38}
39
40impl<T: SigningKey> DkimSigner<T, NeedHeaders> {
41    pub fn headers(
42        mut self,
43        headers: impl IntoIterator<Item = impl Into<String>>,
44    ) -> DkimSigner<T, Done> {
45        self.template.h = headers.into_iter().map(|h| h.into()).collect();
46        DkimSigner {
47            _state: Default::default(),
48            key: self.key,
49            template: self.template,
50        }
51    }
52}
53
54impl<T: SigningKey> DkimSigner<T, Done> {
55    pub fn body_length(mut self, body_length: bool) -> Self {
56        self.template.l = u64::from(body_length);
57        self
58    }
59
60    pub fn header_canonicalization(mut self, ch: Canonicalization) -> Self {
61        self.template.ch = ch;
62        self
63    }
64
65    pub fn body_canonicalization(mut self, cb: Canonicalization) -> Self {
66        self.template.cb = cb;
67        self
68    }
69}