aboutsummaryrefslogtreecommitdiff
path: root/tosin-macros/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tosin-macros/src/lib.rs')
-rw-r--r--tosin-macros/src/lib.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/tosin-macros/src/lib.rs b/tosin-macros/src/lib.rs
index c0651fa..7efbac6 100644
--- a/tosin-macros/src/lib.rs
+++ b/tosin-macros/src/lib.rs
@@ -1,3 +1,5 @@
+#![feature(proc_macro_span)]
+
extern crate proc_macro;
use proc_macro::TokenStream;
@@ -24,3 +26,32 @@ fn impl_model(ast: &syn::DeriveInput) -> TokenStream {
};
gen.into()
}
+
+#[proc_macro]
+pub fn gather_migrations(_input: TokenStream) -> TokenStream {
+ let call_site = proc_macro::Span::call_site();
+ let call_site_file = call_site.source_file();
+ let call_site_path = call_site_file.path();
+ if !call_site_file.is_real() {
+ panic!("call site does not have a real path");
+ }
+
+ let migrations_dir = call_site_path.parent().unwrap();
+ let migrations: Vec<syn::Ident> = migrations_dir.read_dir()
+ .unwrap()
+ .map(Result::unwrap)
+ .map(|x| x.path().file_stem().unwrap().to_string_lossy().into_owned())
+ .filter(|x| x != "mod")
+ .map(|x| syn::parse_str(&x).unwrap())
+ .collect();
+
+ let gen = quote! {
+ #( mod #migrations; )*
+
+ pub const migrations: &[Migration] = &[
+ #(#migrations::MIGRATION),*
+ ];
+ };
+
+ gen.into()
+}