computorv1 1.0.11

An educational computor project solving polynomial equations.
Documentation
use crate::fraction::reduce_decimal;
use crate::parser::parse_equation;
use crate::solver::solve;

pub fn solve_polynomial(input: &str) -> Result<String, String> {
    let mut output = String::new();

    let polynomial = parse_equation(input).map_err(|e| format!("Error: {}", e))?;

    let roots = solve(polynomial).map_err(|e| format!("Error: {}", e))?;

    if roots.real.is_empty() && roots.complex.is_empty() {
        output.push_str("All real numbers are a solution.\n");
    } else {
        if !roots.real.is_empty() {
            output.push_str("Real solutions:\n");
            for sol in &roots.real {
                let line = format!("Converted result: {}\n", display_solution(*sol, None));
                output.push_str(&line);
            }
        }
        if !roots.complex.is_empty() {
            output.push_str("Complex solutions:\n");
            for (real, imag) in &roots.complex {
                let line = format!(
                    "Converted result: {}\n",
                    display_solution(*real, Some(*imag))
                );
                output.push_str(&line);
            }
        }
    }

    Ok(output)
}

fn display_solution(real: f64, imaginary: Option<f64>) -> String {
    match imaginary {
        Some(imag) => format!(
            "{} {} {}i",
            reduce_decimal(real),
            if imag > 0.0 { "+" } else { "" },
            reduce_decimal(imag)
        ),
        None => reduce_decimal(real),
    }
}