diff options
| author | Fuwn <[email protected]> | 2023-04-27 05:52:31 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-04-27 05:52:31 +0000 |
| commit | 2afebbc1f8fa218bb3eae271391b707d14778fc7 (patch) | |
| tree | ce226b86a871110dc86484a2fd9a01db4d501eae /rossweisse/src/implementations/router/methods.rs | |
| parent | docs(readme): add information about examples (diff) | |
| download | windmark-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.rs | 66 |
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() +} |