use std::io;
 
fn get_float_input(prompt: &str) -> f64 {
    let mut result = String::new();
 
    print!("{prompt}");
    io::Write::flush(&mut io::stdout()).expect("Couldn't flush");
 
    io::stdin().read_line(&mut result).expect("Couldn't read");
 
    let result: f64 = result.trim().parse().expect("Invalid input.");
    return result;
}
 
fn main() {
 
    println!("Choose conversion:\n1)C -> F\n2) F -> C\n3) Quit");
 
    loop {
        let mut choice = String::new();
        // Take input
        print!("Enter choice> ");
        io::Write::flush(&mut io::stdout()).expect("Couldn't flush");
 
        io::stdin().read_line(&mut choice).expect("Couldn't read");
 
        let choice: u32 = match choice.trim().parse() {
            Ok(t) => t, Err(_) => {
                println!("Invalid choice.");
                continue;
            }
        };
 
        match choice {
            1 => {
                let target: f64 = get_float_input("Temp in C> ");
                let result: f64 = cel_to_fah(&target);
                println!("{result} F");
                continue;
            },
            2 => {
                let target: f64 = get_float_input("Temp in F> ");
                let result: f64 = fah_to_cel(&target);
                println!("{result} C");
            },
            3 => { break; },
            _ => { continue; },
        };
    }
}
 
fn cel_to_fah(cel: &f64) -> f64 { (9.0/5.0)*cel + 32.0 }
fn fah_to_cel(fah: &f64) -> f64 { (5.0/9.0)*(fah - 32.0) }