hotshot_types/traits/
leaf_fetcher_network.rs1use std::{marker::PhantomData, sync::Arc};
13
14use async_trait::async_trait;
15
16use crate::{
17 data::ViewNumber,
18 traits::{network::ConnectedNetwork, node_implementation::NodeType},
19};
20
21#[async_trait]
29pub trait LeafFetcherNetwork<TYPES: NodeType>: Send + Sync + 'static {
30 async fn send_leaf_request(
31 &self,
32 view: ViewNumber,
33 payload: Vec<u8>,
34 recipient: TYPES::SignatureKey,
35 ) -> anyhow::Result<()>;
36
37 async fn send_leaf_response(
38 &self,
39 view: ViewNumber,
40 payload: Vec<u8>,
41 recipient: TYPES::SignatureKey,
42 ) -> anyhow::Result<()>;
43}
44
45pub struct ConnectedNetworkLeafFetcher<TYPES: NodeType, N> {
49 network: Arc<N>,
50 _marker: PhantomData<fn() -> TYPES>,
51}
52
53impl<TYPES: NodeType, N> ConnectedNetworkLeafFetcher<TYPES, N> {
54 pub fn new(network: Arc<N>) -> Self {
55 Self {
56 network,
57 _marker: PhantomData,
58 }
59 }
60}
61
62#[async_trait]
63impl<TYPES, N> LeafFetcherNetwork<TYPES> for ConnectedNetworkLeafFetcher<TYPES, N>
64where
65 TYPES: NodeType,
66 N: ConnectedNetwork<TYPES::SignatureKey>,
67{
68 async fn send_leaf_request(
69 &self,
70 view: ViewNumber,
71 payload: Vec<u8>,
72 recipient: TYPES::SignatureKey,
73 ) -> anyhow::Result<()> {
74 self.network
75 .direct_message(view, payload, recipient)
76 .await
77 .map_err(Into::into)
78 }
79
80 async fn send_leaf_response(
81 &self,
82 view: ViewNumber,
83 payload: Vec<u8>,
84 recipient: TYPES::SignatureKey,
85 ) -> anyhow::Result<()> {
86 self.network
87 .direct_message(view, payload, recipient)
88 .await
89 .map_err(Into::into)
90 }
91}