Skip to content

Commit b7f3417

Browse files
authored
Merge pull request #39 from Shopify/refactor-generate-types
Refactor generate types
2 parents 80776e3 + c8299de commit b7f3417

File tree

2 files changed

+31
-33
lines changed

2 files changed

+31
-33
lines changed

example/.output.graphql

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
2-
mutation Output($result: FunctionResult!) {
3-
handleResult(result: $result)
4-
}
5-
1+
mutation Output($result: FunctionResult!) {
2+
handleResult(result: $result)
3+
}

shopify_function_macro/src/lib.rs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use std::io::Write;
22
use std::path::Path;
33

4-
use proc_macro2::TokenStream;
5-
use proc_macro2::TokenTree;
4+
use proc_macro2::{Ident, Span, TokenStream, TokenTree};
65
use quote::{quote, ToTokens};
76
use syn::{self, parse::Parse, parse::ParseStream, parse_macro_input, Expr, FnArg, Token};
87

@@ -153,45 +152,46 @@ const OUTPUT_QUERY_FILE_NAME: &str = ".output.graphql";
153152
pub fn generate_types(attr: proc_macro::TokenStream) -> proc_macro::TokenStream {
154153
let params = TokenStream::from(attr);
155154

156-
let cargo_manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
155+
let query_path = extract_attr(&params, "query_path");
157156
let schema_path = extract_attr(&params, "schema_path");
158157

159-
let mut output_query_path = Path::new(&cargo_manifest_dir).to_path_buf();
160-
output_query_path.push(OUTPUT_QUERY_FILE_NAME);
161-
std::fs::File::create(&output_query_path)
162-
.expect("Could not create output query file")
163-
.write_all(
164-
r"
165-
mutation Output($result: FunctionResult!) {
166-
handleResult(result: $result)
167-
}
168-
"
169-
.as_bytes(),
170-
)
171-
.expect("Could not write to .output.query");
158+
let input_struct = generate_struct("Input", &query_path, &schema_path);
159+
let output_struct = generate_struct("Output", OUTPUT_QUERY_FILE_NAME, &schema_path);
160+
let output_query =
161+
"mutation Output($result: FunctionResult!) {\n handleResult(result: $result)\n}\n";
162+
163+
write_output_query_file(OUTPUT_QUERY_FILE_NAME, output_query);
172164

173165
quote! {
174-
#[derive(graphql_client::GraphQLQuery, Clone, Debug, serde::Deserialize, PartialEq)]
175-
#[serde(rename_all(deserialize = "camelCase"))]
176-
#[graphql(
177-
#params,
178-
response_derives = "Clone,Debug,PartialEq,Eq,Deserialize",
179-
variables_derives = "Clone,Debug,PartialEq,Eq,Deserialize",
180-
skip_serializing_none
181-
)]
182-
struct Input;
166+
#input_struct
167+
#output_struct
168+
}
169+
.into()
170+
}
171+
172+
fn generate_struct(name: &str, query_path: &str, schema_path: &str) -> TokenStream {
173+
let name_ident = Ident::new(name, Span::mixed_site());
183174

175+
quote! {
184176
#[derive(graphql_client::GraphQLQuery, Clone, Debug, serde::Deserialize, PartialEq)]
185177
#[graphql(
186-
query_path = #OUTPUT_QUERY_FILE_NAME,
178+
query_path = #query_path,
187179
schema_path = #schema_path,
188180
response_derives = "Clone,Debug,PartialEq,Eq,Deserialize",
189181
variables_derives = "Clone,Debug,PartialEq,Eq,Deserialize",
190182
skip_serializing_none
191183
)]
192-
struct Output;
184+
struct #name_ident;
193185
}
194-
.into()
186+
}
187+
188+
fn write_output_query_file(output_query_file_name: &str, contents: &str) {
189+
let cargo_manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
190+
let output_query_path = Path::new(&cargo_manifest_dir).join(output_query_file_name);
191+
std::fs::File::create(output_query_path)
192+
.expect("Could not create output query file")
193+
.write_all(contents.as_bytes())
194+
.unwrap_or_else(|_| panic!("Could not write to {}", output_query_file_name));
195195
}
196196

197197
#[cfg(test)]

0 commit comments

Comments
 (0)