leetrs 1.1.0

A command-line tool to interact with LeetCode.
//! CLI result formatting for submission and test results.
//!
//! Keeps all `println!` / `eprintln!` calls out of business logic so that
//! [`SubmissionResult`] can later be displayed in the TUI as well.
use crate::services::submission::{SubmissionResult, SubmissionStatus};

/// Prints a human-readable summary of a submission or test result to stdout.
pub fn format_result(result: &SubmissionResult) {
    println!("\n==================================================");

    if result.is_test {
        let passed = result.correct_answer.unwrap_or(false);
        if passed {
            println!("  โœ… All test cases passed");
        } else {
            println!("  โŒ Test Failed");
        }
        println!("==================================================\n");

        if let (Some(correct), Some(total)) = (result.total_correct, result.total_testcases) {
            println!("๐Ÿงช Testcases: {} / {} passed", correct, total);
        }

        match &result.status {
            SubmissionStatus::Accepted if passed => {
                if let Some(runtime) = &result.runtime {
                    println!("โฑ๏ธ Runtime: {}", runtime);
                }
                if let Some(memory) = &result.memory {
                    println!("๐Ÿ’พ Memory: {}", memory);
                }
                if let Some(mp) = result.memory_percentile {
                    println!("๐Ÿ“ Memory Percentile: {:.2}%", mp);
                }
                if let Some(rp) = result.runtime_percentile {
                    println!("โฐ Runtime Percentile: {:.2}%", rp);
                }
            }
            SubmissionStatus::Accepted => {
                if let (Some(code_answers), Some(expected)) =
                    (&result.code_answer, &result.expected_code_answer)
                {
                    println!("Expected");
                    println!("{}", expected.join("\t"));
                    println!("Output");
                    println!("{}", code_answers.join("\t"));
                }
            }
            SubmissionStatus::RuntimeError => {
                if let Some(err) = &result.full_runtime_error {
                    println!("โŒ Error\n{}", err);
                }
            }
            _ => {}
        }
    } else {
        let status_label = match &result.status {
            SubmissionStatus::Accepted => {
                println!("  โœ… Accepted");
                "Accepted"
            }
            SubmissionStatus::WrongAnswer => {
                println!("  โŒ Wrong Answer");
                "Wrong Answer"
            }
            SubmissionStatus::CompileError => {
                println!("  โŒ Compile Error");
                "Compile Error"
            }
            SubmissionStatus::RuntimeError => {
                println!("  โŒ Runtime Error");
                "Runtime Error"
            }
            SubmissionStatus::TimeLimitExceeded => {
                println!("  โŒ Time Limit Exceeded");
                "Time Limit Exceeded"
            }
            SubmissionStatus::Unknown(msg) => {
                println!("  โŒ {}", msg);
                msg.as_str()
            }
        };
        println!("==================================================\n");

        if let (Some(correct), Some(total)) = (result.total_correct, result.total_testcases) {
            println!("๐Ÿงช Testcases: {} / {} passed", correct, total);
        }

        match &result.status {
            SubmissionStatus::Accepted => {
                if let Some(runtime) = &result.runtime {
                    println!("โฑ๏ธ Runtime: {}", runtime);
                }
                if let Some(memory) = &result.memory {
                    println!("๐Ÿ’พ Memory: {}", memory);
                }
                if let Some(mp) = result.memory_percentile {
                    println!("๐Ÿ“ Memory Percentile: {:.2}%", mp);
                }
                if let Some(rp) = result.runtime_percentile {
                    println!("โฐ Runtime Percentile: {:.2}%", rp);
                }
            }
            SubmissionStatus::CompileError => {
                if let Some(err) = &result.compile_error {
                    println!("๐Ÿ’ฅ Compiler Output:\n{}", err);
                }
            }
            SubmissionStatus::WrongAnswer => {
                if let Some(input) = &result.input {
                    print!("INPUT: ");
                    for part in input.split('\n') {
                        print!("{}\t", part);
                    }
                    println!();
                }
                if let (Some(expected), Some(output)) =
                    (&result.expected_output, &result.code_output)
                {
                    println!("Expected: {}\nOutput: {}", expected, output);
                }
            }
            SubmissionStatus::RuntimeError => {
                if let Some(err) = &result.full_runtime_error {
                    println!("โŒ Error\n{}", err);
                }
            }
            _ => {
                let _ = status_label;
            }
        }
    }
}