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