cardano_sdk/protocol/
handshake.rs

1use super::basic::*;
2use cbored::CborRepr;
3use strum::EnumDiscriminants;
4
5use super::*;
6
7#[derive(Clone, Debug, EnumDiscriminants, CborRepr, PartialEq, Eq)]
8#[cborrepr(enumtype = "tagvariant")]
9#[strum_discriminants(name(HandshakeNodeKind))]
10pub enum HandshakeNode {
11    Propose(VersionProposal),
12    Accept(Version, HandshakeNodeData),
13    Refuse(RefuseReason),
14}
15
16impl HandshakeNode {
17    pub fn propose(magic: Magic, diffusion: DiffusionMode, versions: &[Version]) -> Self {
18        let map = versions
19            .iter()
20            .map(|ver| (*ver, (HandshakeNodeData { magic, diffusion })))
21            .collect();
22        Self::Propose(VersionProposal(map))
23    }
24}
25
26impl Protocol for HandshakeNode {
27    const NUMBER: u16 = 0;
28}
29
30#[derive(Debug, Clone, CborRepr, PartialEq, Eq)]
31#[cborrepr(structure = "array")]
32pub struct HandshakeNodeData {
33    pub magic: Magic,
34    pub diffusion: DiffusionMode,
35}
36
37crate::map_structure!(VersionProposal, Version, HandshakeNodeData);
38
39#[derive(Debug, Clone, CborRepr, PartialEq, Eq)]
40#[cborrepr(enumtype = "tagvariant")]
41pub enum RefuseReason {
42    VersionMismatch(Versions),
43    HandshakeDecodeError(Version, String),
44    Refused(Version, String),
45}