From 2afebbc1f8fa218bb3eae271391b707d14778fc7 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Thu, 27 Apr 2023 05:52:31 +0000 Subject: feat(rossweisse): initial implementation of struct router framework --- rossweisse/src/lib.rs | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 rossweisse/src/lib.rs (limited to 'rossweisse/src/lib.rs') diff --git a/rossweisse/src/lib.rs b/rossweisse/src/lib.rs new file mode 100644 index 0000000..315a0de --- /dev/null +++ b/rossweisse/src/lib.rs @@ -0,0 +1,91 @@ +// This file is part of 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 . +// +// Copyright (C) 2022-2023 Fuwn +// SPDX-License-Identifier: GPL-3.0-only + +#![deny( + clippy::all, + clippy::nursery, + clippy::pedantic, + future_incompatible, + nonstandard_style, + rust_2018_idioms, + unsafe_code, + unused, + warnings +)] +#![recursion_limit = "128"] + +mod implementations; + +use proc_macro::TokenStream; +use syn::Item; + +/// Marks a `struct` as a router or marks an `impl` block as a router +/// implementation +/// +/// # Examples +/// +/// ```rust +/// #[rossweisse::router] +/// struct Router { +/// _phantom: (), +/// } +/// +/// #[rossweisse::router] +/// impl Router { +/// #[route] +/// pub fn index( +/// _context: windmark::context::RouteContext, +/// ) -> windmark::Response { +/// windmark::Response::success("Hello, World!") +/// } +/// } +/// ``` +#[proc_macro_attribute] +pub fn router(arguments: TokenStream, item: TokenStream) -> TokenStream { + let output = match syn::parse::(item.clone()) { + Ok(Item::Struct(item)) => implementations::fields(arguments, item), + Ok(Item::Impl(item)) => implementations::methods(arguments, item), + _ => panic!("`#[rossweisse::router]` can only be used on `struct`s"), + }; + + output.into() +} + +/// Marks a method of a router implementation as a route to mount +/// +/// # Examples +/// +/// ```rust +/// #[rossweisse::router] +/// impl Router { +/// #[route] +/// pub fn index( +/// _context: windmark::context::RouteContext, +/// ) -> windmark::Response { +/// windmark::Response::success("Hello, World!") +/// } +/// } +/// ``` +#[proc_macro_attribute] +pub fn route(arguments: TokenStream, item: TokenStream) -> TokenStream { + let output = match syn::parse::(item.clone()) { + Ok(Item::Fn(item)) => implementations::route(arguments, item), + _ => panic!("`#[rossweisse::route]` can only be used on `fn`s"), + }; + + output.into() +} -- cgit v1.2.3