1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use anyhow::Context;
use mithril_common::{
    entities::Signer,
    messages::{RegisterSignerMessage, TryFromMessageAdapter},
    StdResult,
};

/// Adapter to convert [RegisterSignerMessage] to [Signer] instances.
pub struct FromRegisterSignerAdapter;

impl TryFromMessageAdapter<RegisterSignerMessage, Signer> for FromRegisterSignerAdapter {
    /// Method to trigger the conversion.
    fn try_adapt(register_signer_message: RegisterSignerMessage) -> StdResult<Signer> {
        Ok(Signer {
            party_id: register_signer_message.party_id,
            verification_key: register_signer_message
                .verification_key
                .try_into()
                .with_context(|| {
                    "'FromRegisterSignerAdapter' can not convert the verification key"
                })?,
            verification_key_signature: match register_signer_message.verification_key_signature {
                Some(verification_key_signature) => {
                    Some(verification_key_signature.try_into().with_context(|| {
                        "'FromRegisterSignerAdapter' can not convert the verification key signature"
                    })?)
                }
                _ => None,
            },
            operational_certificate: match register_signer_message.operational_certificate {
                Some(operational_certificate) => {
                    Some(operational_certificate.try_into().with_context(|| {
                        "'FromRegisterSignerAdapter' can not convert the operational certificate"
                    })?)
                }
                _ => None,
            },
            kes_period: register_signer_message.kes_period,
        })
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_simple_message() {
        let register_signer_message = RegisterSignerMessage {
            party_id: "one".to_string(),
            ..RegisterSignerMessage::dummy()
        };

        let signer = FromRegisterSignerAdapter::try_adapt(register_signer_message)
            .expect("Converting message to signer should not fail");

        assert_eq!("one".to_string(), signer.party_id);
    }
}