1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
use console::style;
use dialoguer::{theme::ColorfulTheme, Input, Select};
use temp_converter::*;
use thousands::Separable;
fn main() -> std::io::Result<()> {
// Define the possible choices of temperature units
let items = ["Celsius", "Fahrenheit", "Kelvin"];
// User prompt for selecting the initial temperature unit
let from = Select::with_theme(&ColorfulTheme::default())
.with_prompt("What unit do you want to convert from?")
.clear(true)
.report(true)
.items(&items)
.default(0)
.interact_opt()?;
if from.is_none() {
println!("Goodbye!");
return Ok(());
}
// User prompt for the output temperature unit
let to = Select::with_theme(&ColorfulTheme::default())
.with_prompt("What unit do you want to convert it into?")
.clear(true)
.report(true)
.items(&items)
.default(0)
.interact_opt()?;
if to.is_none() {
println!("Goodbye!");
return Ok(());
}
// Initial value prompt
let input: String = Input::with_theme(&ColorfulTheme::default())
.with_prompt("Please write the value")
.report(true)
.validate_with(|input: &String| -> Result<(), &str> {
if input.parse::<f32>().is_ok() {
Ok(())
} else {
Err("Please input a valid number")
}
})
.interact_text()?;
// Convert the input string to a floating point number,
// unwrapping fearlessly because the input has already been validated
let input_number: f32 = input.parse().unwrap();
let result: f32;
// Stack allocated buffer for result formatting
let mut output = String::new();
// Match all possible choices, using the corresponding function on each one
if let Some(from_index) = from {
if let Some(to_index) = to {
match from_index {
0 => {
if to_index == 1 {
result = celsius_to_fahrenheit(input_number);
output = format!(
"{} {} °F",
style("Result:").green(),
result.separate_with_commas()
);
} else if to_index == 2 {
result = celsius_to_kelvin(input_number);
output = format!(
"{} {} K",
style("Result:").green(),
result.separate_with_commas()
);
} else {
result = input_number;
output = format!(
"{} {} °C",
style("Result:").green(),
result.separate_with_commas()
);
}
}
1 => {
if to_index == 0 {
result = fahrenheit_to_celsius(input_number);
output = format!(
"{} {} °C",
style("Result:").green(),
result.separate_with_commas()
);
} else if to_index == 2 {
result = fahrenheit_to_kelvin(input_number);
output = format!(
"{} {} K",
style("Result:").green(),
result.separate_with_commas()
);
} else {
result = input_number;
output = format!(
"{} {} °F",
style("Result:").green(),
result.separate_with_commas()
);
}
}
2 => {
if to_index == 0 {
result = kelvin_to_celsius(input_number);
output = format!(
"{} {} °C",
style("Result:").green(),
result.separate_with_commas()
);
} else if to_index == 1 {
result = kelvin_to_fahrenheit(input_number);
output = format!(
"{} {} °F",
style("Result:").green(),
result.separate_with_commas()
);
} else {
result = input_number;
output = format!(
"{} {} K",
style("Result:").green(),
result.separate_with_commas()
);
}
}
_ => {}
}
}
}
println!("{output}");
Ok(())
}