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
18pub 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
28pub 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}