1use std::env;
2use std::net::SocketAddr;
3
4use log::info;
5use pastry_dht::error::*;
6use pastry_dht::{node::PastryNode, Config};
7
8struct KVStoreNode {
9 pastry_node: PastryNode,
10}
11
12impl KVStoreNode {
13 pub fn new(addr: SocketAddr, pub_addr: SocketAddr) -> Result<Self> {
14 let config = Config::new(16);
15 Ok(KVStoreNode {
16 pastry_node: PastryNode::new(config, addr, pub_addr)?,
17 })
18 }
19
20 pub async fn serve(&mut self, bootstrap_addr: Option<&str>) -> Result<()> {
21 self.pastry_node
22 .clone()
23 .bootstrap_and_serve(bootstrap_addr)
24 .await
25 }
26}
27
28#[tokio::main]
29async fn main() -> Result<()> {
30 let args: Vec<String> = env::args().collect();
31 let port = args
32 .get(1)
33 .ok_or(Error::Parse("missing port argument".into()))?;
34
35 let bootstrap_addr = args.get(2).map(|s| s.as_str());
36
37 env_logger::init();
38
39 let addr: SocketAddr = format!("0.0.0.0:{}", port).parse()?;
40 info!("Initializing node on {}", addr);
41
42 KVStoreNode::new(addr, addr)?.serve(bootstrap_addr).await
43}