各コインのUSDレートをbitcoinのUSDレートで割れば、スワッピングレートが計算される。
f32のvectorはpartial_cmpで比較してソートする。
let mut coin_rate = get_price().await.unwrap(); let objs: Vec<Rate> = serde_json::from_value(coin_rate).unwrap(); let mut btcRate: f32 = 0.0; let mut crypt_objs: Vec<Rate> = Vec::new(); for obj in objs { if obj.r#type == "crypto" { if obj.symbol == "BTC" { crypt_objs.insert(0, obj.clone()); btcRate = obj.rateUsd.parse::<f32>().unwrap(); } else { crypt_objs.push(obj); } } } println!("{}", &btcRate); let mut data: Vec<RateSwap> = vec![]; for crypt_obj in crypt_objs { let obj = RateSwap { id: crypt_obj.id, symbol: crypt_obj.symbol, rateUsd: crypt_obj.rateUsd.clone(), rateBtc: crypt_obj.rateUsd.parse::<f32>().unwrap() / &btcRate }; data.push(obj); } data.sort_by(|a, b| a.rateBtc.partial_cmp(&b.rateBtc).unwrap().reverse()); let mut context = tera::Context::new(); context.insert("title", "Index page"); context.insert("data", &data);
おおお、割とやりたいことはできている気がする。
対btcではなく、コイン対コインでスワッピングする場合も同様のロジックで、交換する両方のコインのUSDレートで割ればスワッピングレートが計算できる。
Nice、次はaxumのログイン機能およびDB連携