use std::net::SocketAddr;
use clap::{Parser, ValueEnum};
use client::run_client;
use dfir_rs::lang::graph::{WriteConfig, WriteGraphType};
use dfir_rs::util::ipv4_resolve;
use server::run_server;
mod client;
mod helpers;
mod protocol;
mod server;
#[dfir_rs::main]
async fn main() {
let opts = Opts::parse();
match opts.role {
Role::Client => {
run_client(opts).await;
}
Role::Server => {
run_server(opts).await;
}
}
}
#[derive(Parser, Debug)]
struct Opts {
#[clap(value_enum, long)] role: Role,
#[clap(long, value_parser = ipv4_resolve, default_value = DEFAULT_SERVER_ADDRESS)]
address: SocketAddr,
#[clap(long, value_parser = ipv4_resolve)]
peer_address: Option<SocketAddr>,
#[clap(long)]
graph: Option<WriteGraphType>,
#[clap(flatten)]
write_config: Option<WriteConfig>,
}
pub const DEFAULT_SERVER_ADDRESS: &str = "localhost:52071";
#[derive(Clone, ValueEnum, Debug)]
enum Role {
Client,
Server,
}
#[test]
fn test() {
use example_test::run_current_example;
let mut server_1 = run_current_example!("--role server --address 127.0.0.1:2071");
server_1
.read_string("Server is live! Listening on 127.0.0.1:2071 and talking to peer server None");
let mut client_1 = run_current_example!("--role client --address 127.0.0.1:2071");
client_1.read_regex(
r"Client is live! Listening on 127\.0\.0\.1:\d+ and talking to server on 127\.0\.0\.1:2071",
);
client_1.write_line("PUT a,7");
let mut server_2 = run_current_example!(
"--role server --address 127.0.0.1:2073 --peer-address 127.0.0.1:2071"
);
server_2.read_string("Server is live! Listening on 127.0.0.1:2073 and talking to peer server Some(127.0.0.1:2071)");
server_2
.read_string(r#"Message received PeerGossip { key: "a", value: "7" } from 127.0.0.1:2071"#);
let mut client_2 = run_current_example!("--role client --address 127.0.0.1:2073");
client_2.read_regex(
r"Client is live! Listening on 127\.0\.0\.1:\d+ and talking to server on 127\.0\.0\.1:2073",
);
client_2.write_line("GET a");
client_2.read_string(r#"Got a Response: ServerResponse { key: "a", value: "7" }"#);
}