modelc 0.1.0

Compile model weight files to standalone executable binaries
Documentation
mod common;

use std::fs;
use std::net::SocketAddr;

use modelc::cli::WeightFormat;
use modelc::compiler;

#[test]
#[ignore]
fn test_e2e_compile_safetensors() {
    let dir = tempfile::tempdir().unwrap();
    let weights_path = dir.path().join("test_model.safetensors");
    let output_path = dir.path().join("test_model_serve");

    let w_data = common::f32_to_bytes(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
    let b_data = common::f32_to_bytes(&[0.1, 0.2, 0.3]);
    common::create_safetensors_file(
        &weights_path,
        vec![
            ("bias", "F32", vec![3], b_data),
            ("weight", "F32", vec![2, 3], w_data),
        ],
    );

    let result = compiler::compile(
        &weights_path,
        Some(&output_path),
        Some(&WeightFormat::Safetensors),
        None,
        SocketAddr::from(([127, 0, 0, 1], 18080)),
        None,
        false,
    );

    match result {
        Ok(bin_path) => {
            assert!(bin_path.exists());
            let metadata = fs::metadata(&bin_path).unwrap();
            assert!(metadata.len() > 0);
        }
        Err(e) => {
            eprintln!("e2e compile skipped or failed: {}", e);
        }
    }
}

#[test]
#[ignore]
fn test_e2e_compile_detect_format() {
    let dir = tempfile::tempdir().unwrap();
    let weights_path = dir.path().join("auto.safetensors");
    let output_path = dir.path().join("auto_serve");

    let data = common::f32_to_bytes(&[1.0, 0.0, 0.0, 1.0]);
    common::create_safetensors_file(&weights_path, vec![("eye", "F32", vec![2, 2], data)]);

    let result = compiler::compile(
        &weights_path,
        Some(&output_path),
        None,
        None,
        SocketAddr::from(([127, 0, 0, 1], 18081)),
        None,
        false,
    );

    match result {
        Ok(bin_path) => {
            assert!(bin_path.exists());
        }
        Err(e) => {
            eprintln!("e2e compile skipped or failed: {}", e);
        }
    }
}

#[test]
fn test_inspect_safetensors() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("inspect.safetensors");

    let w_data = common::f32_to_bytes(&[1.0, 2.0, 3.0, 4.0]);
    common::create_safetensors_file(&path, vec![("kernel", "F32", vec![2, 2], w_data)]);

    let result = compiler::inspect(&path, Some(&WeightFormat::Safetensors));
    assert!(result.is_ok());
}

#[test]
fn test_inspect_detect_format() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("detect.safetensors");

    let data = common::f32_to_bytes(&[1.0]);
    common::create_safetensors_file(&path, vec![("x", "F32", vec![1], data)]);

    let result = compiler::inspect(&path, None);
    assert!(result.is_ok());
}

#[test]
fn test_inspect_nonexistent() {
    let result = compiler::inspect(std::path::Path::new("/nonexistent.safetensors"), None);
    assert!(result.is_err());
}

#[test]
fn test_inspect_unknown_format() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("unknown.xyz");
    std::fs::write(&path, b"data").unwrap();

    let result = compiler::inspect(&path, None);
    assert!(result.is_err());
}

#[test]
fn test_compile_unknown_format_no_flag() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("unknown.xyz");
    std::fs::write(&path, b"data").unwrap();

    let result = compiler::compile(
        &path,
        None,
        None,
        None,
        SocketAddr::from(([0, 0, 0, 0], 8080)),
        None,
        false,
    );
    assert!(result.is_err());
}