1use super::{BasicStage, CredentialMaterial, Timed, X509Material};
4use crate::pki::ParticipantError;
5use crate::source::Query;
6use crate::timestamp::TimestampScope;
7
8pub struct LongTerm<'a, T, M, C> {
14 timed: &'a T,
15 x509: &'a M,
16 credentials: &'a C,
17 material_complete: bool,
18}
19
20impl<T, M, C> LongTerm<'_, T, M, C> {
21 #[must_use]
23 pub fn timed(&self) -> &T {
24 self.timed
25 }
26 #[must_use]
28 pub fn x509(&self) -> &M {
29 self.x509
30 }
31 #[must_use]
33 pub fn credentials(&self) -> &C {
34 self.credentials
35 }
36 #[must_use]
39 pub fn all_material_requirements_met(&self) -> bool {
40 self.material_complete
41 }
42}
43
44pub type MaterialResult<'a, T, M, C, N> = Result<LongTerm<'a, T, M, C>, ParticipantError<N>>;
46
47type TimedOf<'a, 'c, 'd, 'path, 'document, B, Q, I> = Timed<
48 'a,
49 'c,
50 'd,
51 B,
52 <B as BasicStage<'path, 'document>>::Signer,
53 <Q as Query>::Id,
54 <Q as Query>::Document,
55 <Q as Query>::Generation,
56 I,
57>;
58
59pub fn long_term<'s, 'a, 'c, 'd, 'path, 'document, B, M, C, Q, I>(
67 timed: &'s TimedOf<'a, 'c, 'd, 'path, 'document, B, Q, I>,
68 x509: &'s M,
69 credentials: &'s C,
70 query: &Q,
71) -> MaterialResult<'s, TimedOf<'a, 'c, 'd, 'path, 'document, B, Q, I>, M, C, Q::Id>
72where
73 'document: 'path,
74 B: BasicStage<'path, 'document, Id = Q::Id, Document = Q::Document, Generation = Q::Generation>,
75 M: X509Material<
76 'path,
77 'document,
78 Id = Q::Id,
79 Document = Q::Document,
80 Generation = Q::Generation,
81 Issuer = I,
82 >,
83 C: CredentialMaterial<Id = Q::Id, Document = Q::Document, Generation = Q::Generation>,
84 Q: Query,
85{
86 let requirements = x509.requirements();
87 if !matches!(requirements.scope(), TimestampScope::All(_))
88 || !matches!(credentials.scope(), TimestampScope::All(_))
89 {
90 return Err(ParticipantError::Foreign {
91 signature: requirements.signature(),
92 });
93 }
94 let basic = timed.basic();
95 requirements.require_inputs(
96 basic.signer(),
97 basic.counters(),
98 credentials.credentials(),
99 timed.paths(),
100 query,
101 )?;
102 Ok(LongTerm {
103 timed,
104 x509,
105 credentials,
106 material_complete: x509.all_x509_requirements_met() && credentials.all_requirements_met(),
107 })
108}