clex_llm 0.3.4

Generates clex from input format and constraints in natural language using LLM.
Documentation
use ccode_runner::lang_runner::{language_name::LanguageName, program_store::ProgramStore};
use clex_llm::{create_code_generator, generate_code_solution};
use std::env;

use crate::utils::is_gemini_quota_error;

mod utils;

#[tokio::test]
async fn test_generate_code_solution() {
    let api_key = env::var("GOOGLE_API_KEY").ok();

    if api_key.is_none() {
        eprintln!("Skipping test_generate_code_solution: GOOGLE_API_KEY not set");
        return;
    }

    let generator =
        create_code_generator(api_key.as_deref().unwrap()).expect("Failed to create generator");

    let statement = "Given an array of integers, find the sum of all elements.";
    let input_format = "First line contains N denoting the size of array. Second line contains N space-separated integers.";
    let constraints = "1 ≤ N ≤ 1000\n-10^9 ≤ array elements ≤ 10^9";

    let result = generate_code_solution(&generator, statement, input_format, constraints).await;

    match result {
        Ok((solution, language_name)) => {
            let correct_code = r#"n = int(input())
arr = list(map(int, input().split()))
print(sum(arr))"#;
            let runner = ProgramStore::new_from_text(
                correct_code,
                &solution,
                LanguageName::Python,
                language_name,
                false,
            )
            .unwrap();

            let (has_matched, _, _) = runner
                .run_codes_and_compare_output("10\n1 2 3 4 5 6 7 8 9 10")
                .unwrap();
            assert!(has_matched);
        }
        Err(e) => {
            let msg = format!("{e:?}");
            if is_gemini_quota_error(&msg) {
                eprintln!("Skipping test_generate_code_solution due to Gemini rate limit: {msg}");
                return;
            }
            panic!("Failed to generate code solution: {e:?}");
        }
    }
}