cardano_sdk/protocol/
handshake.rs1use 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}