fractions 0.1.0

A simple, lightweight crate for fraction arithmetic
Documentation
use fractions::Fraction;
use std::io::{self, Write};

fn main() {
    println!("Fraction Calculator");
    println!("==================");

    let fraction1 = match get_fraction("Enter first fraction (e.g., 3/4 or 5): ") {
        Ok(f) => f,
        Err(e) => {
            eprintln!("Error: {}", e);
            return;
        }
    };

    let fraction2 = match get_fraction("Enter second fraction (e.g., 1/2 or 3): ") {
        Ok(f) => f,
        Err(e) => {
            eprintln!("Error: {}", e);
            return;
        }
    };

    print!("Enter operation (+, -, *, /): ");
    io::stdout().flush().unwrap();

    let mut operation = String::new();
    io::stdin()
        .read_line(&mut operation)
        .expect("Failed to read operation");

    let result = match operation.trim() {
        "+" => Ok(fraction1 + fraction2),
        "-" => Ok(fraction1 - fraction2),
        "*" => Ok(fraction1 * fraction2),
        "/" => fraction1 / fraction2,
        _ => {
            eprintln!("Unknown operation! Use +, -, *, or /");
            return;
        }
    };

    match result {
        Ok(fraction) => {
            println!("\nResult: {} = {:.4}", fraction, fraction.to_f64());
        }
        Err(e) => eprintln!("Error: {}", e),
    }
}

fn get_fraction(prompt: &str) -> Result<Fraction, Box<dyn std::error::Error>> {
    print!("{}", prompt);
    io::stdout().flush()?;

    let mut input = String::new();
    io::stdin().read_line(&mut input)?;
    let input = input.trim();

    if input.contains('/') {
        let parts: Vec<&str> = input.split('/').collect();
        if parts.len() != 2 {
            return Err("Invalid format".into());
        }

        let num: i64 = parts[0].parse()?;
        let den: i64 = parts[1].parse()?;
        Ok(Fraction::new(num, den)?)
    } else {
        let num: i64 = input.parse()?;
        Ok(Fraction::from(num))
    }
}