exoware-sql 2026.5.0

SQL engine backed by the Exoware API.
Documentation
use std::path::{Path, PathBuf};
use std::process::Command;

const SQL_PROTO_FILES: &[&str] = &[
    "sql/v1/common.proto",
    "sql/v1/schema.proto",
    "sql/v1/query.proto",
    "sql/v1/stream.proto",
    "sql/v1/service.proto",
];

fn main() {
    println!("cargo:rerun-if-env-changed=PROTO_GEN");
    println!("cargo:rerun-if-changed=../../proto");

    if std::env::var("PROTO_GEN").is_err() {
        return;
    }

    let manifest_dir =
        PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR"));
    let gen_dir = manifest_dir.join("src/gen");
    let workspace_root = manifest_dir
        .parent()
        .and_then(|path| path.parent())
        .expect("sql/rs should be two levels below workspace root")
        .to_path_buf();

    let descriptor = gen_dir.join("descriptor.bin");
    buf_build(&workspace_root, &descriptor);

    let mut buffa_config = connectrpc_build::CodeGenConfig::default();
    buffa_config.generate_json = true;
    buffa_config.file_per_package = true;
    buffa_config.bytes_fields = vec![".".into()];

    connectrpc_build::Config::new()
        .files(SQL_PROTO_FILES)
        .descriptor_set(&descriptor)
        .buffa_config(buffa_config)
        .emit_register_fn(false)
        .out_dir(&gen_dir)
        .compile()
        .expect("connectrpc codegen");

    std::fs::remove_file(&descriptor).expect("cleanup descriptor");
}

fn buf_build(workspace_root: &Path, descriptor_out: &Path) {
    let output = Command::new("buf")
        .current_dir(workspace_root)
        .args(["build", "proto", "--as-file-descriptor-set", "-o"])
        .arg(descriptor_out)
        .output()
        .expect("failed to run buf");
    if !output.status.success() {
        panic!(
            "buf build failed: {}",
            String::from_utf8_lossy(&output.stderr)
        );
    }
}