use libitofin::handle::Handle;
use libitofin::indexes::IborIndex;
use libitofin::indexes::ibor::Euribor;
use libitofin::instrument::Instrument; use libitofin::instruments::MakeVanillaSwap;
use libitofin::interestrate::Compounding;
use libitofin::settings::Settings;
use libitofin::shared::{Shared, shared};
use libitofin::termstructures::yields::FlatForward;
use libitofin::termstructures::yieldtermstructure::YieldTermStructure;
use libitofin::time::date::{Date, Month};
use libitofin::time::daycounters::actual360::Actual360;
use libitofin::time::frequency::Frequency;
use libitofin::time::period::Period;
use libitofin::time::timeunit::TimeUnit;
fn main() -> libitofin::errors::QlResult<()> {
let today = Date::new(7, Month::July, 2026);
let settings: Shared<Settings<Date>> = shared(Settings::<Date>::new());
settings.set_evaluation_date(today);
let curve: Handle<dyn YieldTermStructure> = Handle::new(shared(FlatForward::with_rate(
today,
0.02,
Actual360::new(),
Compounding::Continuous,
Frequency::Annual,
))
as Shared<dyn YieldTermStructure>);
let index: Shared<IborIndex> = shared(Euribor::six_months(curve, Shared::clone(&settings)));
let mut swap = MakeVanillaSwap::new(
Period::new(5, TimeUnit::Years),
Shared::clone(&index),
Some(0.03), Period::new(0, TimeUnit::Days), Shared::clone(&settings),
)
.with_effective_date(Date::new(9, Month::July, 2026))
.build()?;
let npv = swap.npv()?;
let fair_rate = swap.fixed_vs_floating_mut().fair_rate()?;
println!("Swap NPV: {npv:.6}");
println!("Fair rate: {:.6}%", fair_rate * 100.0);
Ok(())
}