use anyhow::{Context, Result};
use crate::scenario::Scenario;
pub fn run(path: &str) -> Result<()> {
let content = std::fs::read_to_string(path)
.with_context(|| format!("failed to read scenario file: {path}"))?;
let scenario: Scenario =
toml::from_str(&content).with_context(|| format!("failed to parse scenario: {path}"))?;
println!("Scenario: {}", scenario.meta.name);
if !scenario.meta.description.is_empty() {
println!(" {}", scenario.meta.description);
}
println!();
println!("Parameters:");
println!(" warmup_period_slots: {}", scenario.params.warmup_period_slots);
println!(" maintenance_margin_bps: {}", scenario.params.maintenance_margin_bps);
println!(" initial_margin_bps: {}", scenario.params.initial_margin_bps);
println!(" trading_fee_bps: {}", scenario.params.trading_fee_bps);
println!();
println!("Market:");
println!(" initial_oracle_price: {}", scenario.market.initial_oracle_price);
println!(" initial_slot: {}", scenario.market.initial_slot);
println!();
println!("Steps ({} total):", scenario.steps.len());
for (i, step) in scenario.steps.iter().enumerate() {
let desc = match step {
crate::scenario::Step::Deposit { account, amount, .. } => {
format!("deposit {account} {amount}")
}
crate::scenario::Step::Withdraw { account, amount, .. } => {
format!("withdraw {account} {amount}")
}
crate::scenario::Step::Trade { long, short, size, price, .. } => {
format!("trade {long} long / {short} short x {size} @ {price}")
}
crate::scenario::Step::Crank { oracle_price, slot, .. } => {
format!("crank oracle={oracle_price} slot={slot}")
}
crate::scenario::Step::Liquidate { account, .. } => {
format!("liquidate {account}")
}
crate::scenario::Step::Settle { account, .. } => {
format!("settle {account}")
}
crate::scenario::Step::SetOracle { oracle_price, .. } => {
format!("set_oracle {oracle_price}")
}
crate::scenario::Step::SetSlot { slot, .. } => {
format!("set_slot {slot}")
}
crate::scenario::Step::SetFundingRate { rate, .. } => {
format!("set_funding_rate {rate}")
}
crate::scenario::Step::Query { metric, .. } => {
format!("query {metric:?}")
}
crate::scenario::Step::Assert { condition, .. } => {
format!("assert {condition:?}")
}
};
println!(" {:>2}. {desc}", i + 1);
}
println!();
println!("Scenario is valid.");
Ok(())
}