Skip to main content

sqlc_gen_sqlx/
lib.rs

1pub mod catalog;
2pub mod codegen;
3pub mod config;
4pub mod emit;
5pub mod error;
6pub mod ident;
7pub mod plugin;
8pub mod types;
9
10pub use error::Error;
11
12use buffa::{Message as _, MessageView as _};
13use plugin::{GenerateRequestView, GenerateResponse};
14
15/// WASI binary entry: read stdin → process → write stdout.
16pub fn run() -> Result<(), Error> {
17    use std::io::{Read, Write};
18    let mut buf = Vec::new();
19    std::io::stdin().lock().read_to_end(&mut buf)?;
20    let out = run_with_bytes(&buf)?;
21    std::io::stdout().lock().write_all(&out)?;
22    Ok(())
23}
24
25/// Testable core: bytes in, bytes out.
26pub fn run_with_bytes(buf: &[u8]) -> Result<Vec<u8>, Error> {
27    let request = GenerateRequestView::decode_view(buf)?;
28    let config = if request.plugin_options.is_empty() {
29        config::Config::default()
30    } else {
31        config::Config::from_bytes(request.plugin_options)?
32    };
33    let code = codegen::generate(&request, &config)?;
34    let response = GenerateResponse {
35        files: vec![plugin::File {
36            name: config.output.clone(),
37            contents: code.into_bytes(),
38            ..Default::default()
39        }],
40        ..Default::default()
41    };
42    Ok(response.encode_to_vec())
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48    #[allow(unused_imports)]
49    use buffa::Message as _;
50
51    fn empty_request_bytes() -> Vec<u8> {
52        plugin::GenerateRequest {
53            plugin_options: b"{}".to_vec(),
54            ..Default::default()
55        }
56        .encode_to_vec()
57    }
58
59    #[test]
60    fn empty_request_returns_one_file() {
61        let bytes = empty_request_bytes();
62        let out = run_with_bytes(&bytes).expect("run_with_bytes failed");
63        let resp = plugin::GenerateResponse::decode_from_slice(&out).unwrap();
64        assert_eq!(resp.files.len(), 1);
65        assert_eq!(resp.files[0].name, "queries.rs");
66    }
67}