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),
}
}