From dd0653526ec772744bcd4e3f68171580c32326b5 Mon Sep 17 00:00:00 2001 From: Arowolokehinde Date: Wed, 19 Aug 2026 15:09:56 +0100 Subject: [PATCH 1/3] fix(yadio): canonicalise currency codes to uppercase --- src/price/providers/yadio.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/price/providers/yadio.rs b/src/price/providers/yadio.rs index 6d2e49b1..5c5667e3 100644 --- a/src/price/providers/yadio.rs +++ b/src/price/providers/yadio.rs @@ -47,7 +47,7 @@ impl YadioProvider { .btc .into_iter() .filter_map(|(code, value)| match value { - Some(v) if v.is_finite() && v > 0.0 => Some((code, Quote::PerBtc(v))), + Some(v) if v.is_finite() && v > 0.0 => Some((code.to_uppercase(), Quote::PerBtc(v))), _ => None, }) .collect()) @@ -111,6 +111,15 @@ mod tests { assert_eq!(quotes.get("GBP"), Some(&Quote::PerBtc(50_000.0))); } + #[test] + fn canonicalises_lowercase_currency_codes() { + let body = r#"{"BTC": {"usd": 75000.0, "eur": 65000.0}}"#; + let quotes = YadioProvider::parse(body).unwrap(); + assert_eq!(quotes.get("USD"), Some(&Quote::PerBtc(75_000.0))); + assert_eq!(quotes.get("EUR"), Some(&Quote::PerBtc(65_000.0))); + assert!(!quotes.contains_key("usd"), "raw lowercase key must not survive"); + } + #[test] fn parse_error_is_returned() { let err = YadioProvider::parse("not json").unwrap_err(); From 58c4115559b69763f6d24422bf3de4191fc16a2f Mon Sep 17 00:00:00 2001 From: Arowolokehinde Date: Wed, 19 Aug 2026 15:15:11 +0100 Subject: [PATCH 2/3] fix(yadio): canonicalise currency codes to uppercase --- src/price/providers/yadio.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/price/providers/yadio.rs b/src/price/providers/yadio.rs index 5c5667e3..d7d8b346 100644 --- a/src/price/providers/yadio.rs +++ b/src/price/providers/yadio.rs @@ -47,7 +47,9 @@ impl YadioProvider { .btc .into_iter() .filter_map(|(code, value)| match value { - Some(v) if v.is_finite() && v > 0.0 => Some((code.to_uppercase(), Quote::PerBtc(v))), + Some(v) if v.is_finite() && v > 0.0 => { + Some((code.to_uppercase(), Quote::PerBtc(v))) + } _ => None, }) .collect()) @@ -117,7 +119,10 @@ mod tests { let quotes = YadioProvider::parse(body).unwrap(); assert_eq!(quotes.get("USD"), Some(&Quote::PerBtc(75_000.0))); assert_eq!(quotes.get("EUR"), Some(&Quote::PerBtc(65_000.0))); - assert!(!quotes.contains_key("usd"), "raw lowercase key must not survive"); + assert!( + !quotes.contains_key("usd"), + "raw lowercase key must not survive" + ); } #[test] From d8e93dbecc6ba05c48557f69ffbd5cb8ed2ec7b1 Mon Sep 17 00:00:00 2001 From: Arowolokehinde Date: Thu, 20 Aug 2026 12:53:42 +0100 Subject: [PATCH 3/3] =?UTF-8?q?fix(yadio):=20address=20reviewer=20nits=20?= =?UTF-8?q?=E2=80=94=20add=20=C2=A76.6=20comment=20and=20strengthen=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/price/providers/yadio.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/price/providers/yadio.rs b/src/price/providers/yadio.rs index d7d8b346..598d2947 100644 --- a/src/price/providers/yadio.rs +++ b/src/price/providers/yadio.rs @@ -48,6 +48,8 @@ impl YadioProvider { .into_iter() .filter_map(|(code, value)| match value { Some(v) if v.is_finite() && v > 0.0 => { + // Yadio ships uppercase codes today; canonicalise anyway so + // the adapter honours ยง6.6 even if the API drifts. Some((code.to_uppercase(), Quote::PerBtc(v))) } _ => None, @@ -115,8 +117,9 @@ mod tests { #[test] fn canonicalises_lowercase_currency_codes() { - let body = r#"{"BTC": {"usd": 75000.0, "eur": 65000.0}}"#; + let body = r#"{"BTC": {"usd": 75000.0, "Eur": 65000.0}}"#; let quotes = YadioProvider::parse(body).unwrap(); + assert_eq!(quotes.len(), 2, "only the two canonical keys survive"); assert_eq!(quotes.get("USD"), Some(&Quote::PerBtc(75_000.0))); assert_eq!(quotes.get("EUR"), Some(&Quote::PerBtc(65_000.0))); assert!(