各コインの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連携