Re:Pencil: A Microframework Inspired by Flask for Rust
by TheHydroImpulse on Tuesday March 08, 2016 @04:58PM
(#11249087)
There are a few different ways one could achieve this. The first options would be to generate a struct:
struct RouteUser {
route: &'static str,
f: fn(_: &mut Request) -> PencilResult
}
Then given #[route("/user")]
fn user(_: &mut Request) -> PencilResult {}
You would hijack the `user` function to return an instance of the struct. fn user() -> RouteUser {
// The actual function the user wrote:
fn user(_: &mut Request) -> PencilResult {
// ...
}
RouteUser {
// Generated from the annotation argument
route: "/user",
f: user
}
}
There is a difference between item decorators (`#[foobar]`) and regular procedural macros and I'm not completely sure if you could in-fact significantly change the given function. I haven't touched procedural macros in a while.To use the above route, you would simply have a `Route` trait perhaps.
trait Route {}
And implement it for each generated struct: impl Route for RouteUser {}
Then you could use the route as app.route(user());
Which could be defined as fn route<R>(r: R) where R: Route {
// ...
}
Re:Pencil: A Microframework Inspired by Flask for Rust
by fredsir on Wednesday March 09, 2016 @03:26AM
(#11251668)
That seems like a good approach, although one thing is missing: when you use the route-decorator in Flask, the route is registered to the app object "via magic", whereas in your example, you still have to register it manually (`app.route(user())`). Now, I am partial to liking registering manually, like in your example and in Pencil itself, since that's clearer than having a lot of routes spread around in a whole lot of files that are magically registered, but just for the kicks, would it be possible to not having to manually register the route to the app object?
Bearing in mind that macros er unstable, can this be done in Rust, and if so, what would the process be?