1use derive_more::Debug;
2use futures_util::Stream;
3use std::net::SocketAddr;
4use std::pin::Pin;
5use std::task::{Context, Poll};
6use tokio::sync::mpsc;
7
8#[derive(Debug)]
10pub enum Command {
11 AddNode {
13 addr: SocketAddr,
14 },
15 FindPeers {
17 info_hash: [u8; 20],
19 #[debug(skip)]
21 callback: mpsc::Sender<SocketAddr>,
22 local_peer_port: u16,
24 },
25 Shutdown,
27}
28
29pub struct CommandSource(mpsc::Receiver<Command>);
31
32impl Stream for CommandSource {
33 type Item = Command;
34
35 fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
36 self.0.poll_recv(cx)
37 }
38}
39
40pub type CommandSink = mpsc::Sender<Command>;
42
43pub fn setup_commands() -> (CommandSink, CommandSource) {
45 let (sender, receiver) = mpsc::channel(1);
46 (sender, CommandSource(receiver))
47}