use std::{future::IntoFuture, str::FromStr};
use anyhow::Context;
use futures::{stream::FuturesUnordered, StreamExt};
use orchestra_toolkit::*;
async fn run(session: SessionAsync, auth: Token, i: u32) -> anyhow::Result<()> {
let fut = FuturesUnordered::new();
for _ in 0..1000 {
fut.push(
session
.invoke_entity(Entity::new(0, 0, 1), Method::Retrieve, auth)
.into_future(),
)
}
let res: Vec<_> = fut.collect().await;
for r in res {
match r {
Ok(r) => println!("{}: {}", i, r),
Err(e) => println!("{}: {}", i, e),
}
}
Ok(())
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
dotenv::dotenv().ok();
let mut config = SessionConfig::default();
if let Ok(host) = std::env::var("AVESTERRA_HOST") {
config.address = host;
}
if let Ok(port_str) = std::env::var("AVESTERRA_PORT") {
config.port = u16::from_str(&port_str).context("Parsing `AVESTERRA_PORT`")?;
}
if let Ok(cert_dir_path) = std::env::var("AVESTERRA_CERTIFICATE_DIR_PATH") {
config.pem_filepath = (cert_dir_path + "/avesterra.pem").try_into()?;
}
let auth = if let Ok(auth_str) = std::env::var("AVESTERRA_AUTH") {
Token::from_str(&auth_str).context("Parsing authorization token given from env")?
} else {
Token::NULL
};
let session = SessionAsync::initialize(config).await?;
let mut set = tokio::task::JoinSet::new();
for i in 0..1000 {
set.spawn(run(session.clone(), auth, i));
}
while (set.join_next().await).is_some() {}
session.finalize().await;
Ok(())
}