aboutsummaryrefslogtreecommitdiff
path: root/rossweisse/src/implementations/router/methods.rs
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-04-27 05:52:31 +0000
committerFuwn <[email protected]>2023-04-27 05:52:31 +0000
commit2afebbc1f8fa218bb3eae271391b707d14778fc7 (patch)
treece226b86a871110dc86484a2fd9a01db4d501eae /rossweisse/src/implementations/router/methods.rs
parentdocs(readme): add information about examples (diff)
downloadwindmark-2afebbc1f8fa218bb3eae271391b707d14778fc7.tar.xz
windmark-2afebbc1f8fa218bb3eae271391b707d14778fc7.zip
feat(rossweisse): initial implementation of struct router framework
Diffstat (limited to 'rossweisse/src/implementations/router/methods.rs')
-rw-r--r--rossweisse/src/implementations/router/methods.rs66
1 files changed, 66 insertions, 0 deletions
diff --git a/rossweisse/src/implementations/router/methods.rs b/rossweisse/src/implementations/router/methods.rs
new file mode 100644
index 0000000..4f9bbdf
--- /dev/null
+++ b/rossweisse/src/implementations/router/methods.rs
@@ -0,0 +1,66 @@
+// This file is part of Windmark <https://github.com/gemrest/windmark>.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 3.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+// Copyright (C) 2022-2023 Fuwn <[email protected]>
+// SPDX-License-Identifier: GPL-3.0-only
+
+use proc_macro::TokenStream;
+
+pub fn methods(_arguments: TokenStream, item: syn::ItemImpl) -> TokenStream {
+ let routes = item
+ .items
+ .iter()
+ .filter_map(|item| {
+ if let syn::ImplItem::Fn(method) = item {
+ if method
+ .attrs
+ .iter()
+ .any(|attribute| attribute.path().is_ident("route"))
+ {
+ Some(method.sig.ident.clone())
+ } else {
+ None
+ }
+ } else {
+ None
+ }
+ })
+ .collect::<Vec<_>>();
+ let (implementation_generics, type_generics, where_clause) =
+ item.generics.split_for_impl();
+ let name = &item.self_ty;
+ let route_paths = routes
+ .iter()
+ .map(|route| format!("/{}", route))
+ .collect::<Vec<_>>();
+
+ quote::quote! {
+ #item
+
+ impl #implementation_generics #name #type_generics #where_clause {
+ pub fn new() -> Self {
+ let mut router = Self::_new();
+
+ #(
+ router.router.mount(#route_paths, |context| {
+ Self::#routes(context)
+ });
+ )*
+
+ router
+ }
+ }
+ }
+ .into()
+}