use ns3_parallel::{executor::ConfigFormat, BuildCmd, BuildParam, Executor, ExecutorBuilder};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct MyConfig {
pub sim_time: u32,
pub app_name: String,
pub policy: Vec<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MyParam {
pub sim_time: u32,
pub app_name: String,
pub policy: u32,
}
impl Default for MyConfig {
fn default() -> Self {
MyConfig {
sim_time: 100,
app_name: "ns3-tcp-bbr".to_string(),
policy: vec![1, 2, 3],
}
}
}
impl BuildParam<MyParam> for MyConfig {
fn build_param(&self) -> Vec<MyParam> {
let mut params: Vec<MyParam> = Vec::new();
for policy in &self.policy {
let param = MyParam {
sim_time: self.sim_time,
app_name: self.app_name.clone(),
policy: *policy,
};
params.push(param);
}
params
}
}
impl BuildCmd for MyParam {
fn build_cmd(&self) -> String {
format!(
"simple-ns3 --app-name={} --sim-time={} --policy={}",
self.app_name, self.sim_time, self.policy
)
}
}
#[tokio::main]
async fn main() {
let mut exe: Executor<MyConfig, MyParam> = ExecutorBuilder::new()
.config_path("config.toml")
.config_format(ConfigFormat::Toml)
.ns3_path("ns-allinone-3.33/ns-3.33/")
.build()
.unwrap();
let _ = exe.execute().await.unwrap();
let outputs = exe.get_outputs().to_owned();
for (_, output) in outputs {
for task in output {
println!("{}", task.stderr);
}
}
let mut exe: Executor<MyConfig, MyParam> = ExecutorBuilder::new()
.config_path("config.ron")
.config_format(ConfigFormat::Ron)
.ns3_path("ns-allinone-3.33/ns-3.33/")
.task_concurrent(4)
.retry_limit(2)
.build()
.unwrap();
let _ = exe.execute().await.unwrap();
let outputs = exe.get_outputs().to_owned();
for (_, output) in outputs {
for task in output {
println!("{}", task.stderr);
}
}
}