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
15pub 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
25pub 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}