conversions/
conversions.rs1use typed_money::{Amount, Rate, EUR, GBP, JPY, USD};
9
10fn main() {
11 println!("=== Currency Conversion Examples ===\n");
12
13 println!("1. BASIC CONVERSION");
17 println!("-------------------");
18
19 let usd_amount = Amount::<USD>::from_major(100);
20 println!("Starting amount: {}", usd_amount);
21
22 let usd_to_eur = Rate::<USD, EUR>::new(0.85);
24 println!("Exchange rate: 1 USD = 0.85 EUR");
25
26 let eur_amount = usd_amount.convert(&usd_to_eur);
28 println!("Converted amount: {}", eur_amount);
29 println!("(${} × 0.85 = €{})\n", 100, eur_amount.to_major_floor());
30
31 println!("2. INVERSE RATES");
35 println!("----------------");
36
37 let usd_to_eur = Rate::<USD, EUR>::new(0.85);
38 println!("USD → EUR rate: {}", usd_to_eur.value());
39
40 let eur_to_usd = usd_to_eur.inverse();
42 println!("EUR → USD rate (inverse): {}", eur_to_usd.value());
43 println!("(1 / 0.85 = ~1.176)\n");
44
45 let original_usd = Amount::<USD>::from_major(100);
47 let eur = original_usd.convert(&usd_to_eur);
48 let back_to_usd = eur.convert(&eur_to_usd);
49
50 println!("Original: {}", original_usd);
51 println!("To EUR: {}", eur);
52 println!("Back to USD: {}", back_to_usd);
53 println!("(Should be approximately the same)\n");
54
55 println!("3. MULTIPLE CONVERSIONS");
59 println!("-----------------------");
60
61 let usd = Amount::<USD>::from_major(1000);
62 println!("Starting with: {}", usd);
63
64 let usd_to_eur = Rate::<USD, EUR>::new(0.85);
66 let usd_to_gbp = Rate::<USD, GBP>::new(0.73);
67 let usd_to_jpy = Rate::<USD, JPY>::new(110.0);
68
69 println!("\nExchange rates:");
70 println!(" 1 USD = {} EUR", usd_to_eur.value());
71 println!(" 1 USD = {} GBP", usd_to_gbp.value());
72 println!(" 1 USD = {} JPY", usd_to_jpy.value());
73
74 println!("\nConversions:");
75 let eur = usd.convert(&usd_to_eur);
76 let gbp = usd.convert(&usd_to_gbp);
77 let jpy = usd.convert(&usd_to_jpy);
78
79 println!(" {} → {}", usd, eur);
80 println!(" {} → {}", usd, gbp);
81 println!(" {} → {}", usd, jpy);
82
83 println!("\n4. CHAINED CONVERSIONS");
87 println!("----------------------");
88
89 println!("Converting USD → EUR → GBP");
90
91 let usd = Amount::<USD>::from_major(100);
92 let usd_to_eur = Rate::<USD, EUR>::new(0.85);
93 let eur_to_gbp = Rate::<EUR, GBP>::new(0.86);
94
95 println!("Starting: {}", usd);
96 let eur = usd.convert(&usd_to_eur);
97 println!("After USD→EUR: {}", eur);
98 let gbp = eur.convert(&eur_to_gbp);
99 println!("After EUR→GBP: {}", gbp);
100 println!("(${} × 0.85 × 0.86 = £{})\n", 100, gbp.to_major_floor());
101
102 println!("5. RATE METADATA FOR AUDITABILITY");
106 println!("----------------------------------");
107
108 let rate = Rate::<USD, EUR>::new(0.85)
110 .with_timestamp_unix_secs(1700000000)
111 .with_source("ECB"); println!("Rate: {}", rate.value());
114 println!("Timestamp: {:?}", rate.timestamp_unix_secs());
115 println!("Source: {:?}", rate.source());
116
117 let amount = Amount::<USD>::from_major(1000);
118 let converted = amount.convert(&rate);
119 println!(
120 "\nConverted {} to {} using rate from {:?}",
121 amount,
122 converted,
123 rate.source().unwrap_or("unknown")
124 );
125
126 println!("\n6. REAL-WORLD EXAMPLE: INTERNATIONAL PAYMENT");
130 println!("---------------------------------------------");
131
132 let payment_usd = Amount::<USD>::from_major(250);
134 println!("Customer payment: {}", payment_usd);
135
136 let current_rate = Rate::<USD, EUR>::new(0.92)
138 .with_timestamp_unix_secs(1700000000)
139 .with_source("API");
140
141 let payment_eur = payment_usd.convert(¤t_rate);
143 println!("Converted to EUR: {}", payment_eur);
144
145 let fee_percentage = 3; let fee = (payment_eur * fee_percentage) / 100;
148 println!("Transaction fee ({}%): {}", fee_percentage, fee);
149
150 let final_amount = payment_eur - fee;
151 println!("Final amount to recipient: {}", final_amount);
152
153 println!("\nTransaction summary:");
154 println!(" Original: {}", payment_usd);
155 println!(
156 " Rate: {} (from {:?})",
157 current_rate.value(),
158 current_rate.source().unwrap_or("N/A")
159 );
160 println!(" Converted: {}", payment_eur);
161 println!(" Fee: -{}", fee);
162 println!(" Final: {}", final_amount);
163
164 println!("\n7. TYPE SAFETY");
168 println!("--------------");
169
170 println!("✓ Can only convert with matching rate types");
171 println!("✓ USD amount requires Rate<USD, X>");
172 println!("✗ Cannot use Rate<EUR, GBP> on USD amount (compile error!)");
173 println!("\nThe type system ensures you always use the correct exchange rate!");
174
175 println!("\n=== All conversion examples completed! ===");
181}