Learn how #pavex will improve #rustlangβs backend development in @algo_lucaβs talk at @rustlab_conf!
Check out the event here and join Luca in Florence on November 19-21: https://rustlab.it/
#pavex #rustlang #upcomingconferences
@botahamec @benwis it's a commit from #pavex, a new Rust web framework I have been working on.
See https://www.lpalmieri.com/posts/a-taste-of-pavex-rust-web-framework/ for more details!
Borrow checking was one of my nightmares for #pavex.
The framework must generate _valid_ #rust code, which implies that pavex itself needs to be aware of the borrow checker.
After a few days of head scratching, it's working!
There are a few edge cases left, but the core works π
This is related to #pavexβI need to build the packages in the current workspace in a specific order, making sure to execute the code generation step _before_ trying to compile the generated code or any other crate that depends on it.
I could introduce a `cargo` subcommand (e.g. `cargo pavex build`), but it'd be cool to make it transparent.
It looks like the next step for #pavex is becoming more aware of the borrow checker.
In particular:
1. emit code that passes the borrow checker where possible;
2. emit errors when it's impossible;
3. provide a "clone where needed" strategy for when you don't care.
A bit scared of tackling 1. and 2., it could be a significant time sink.
The API for nesting in #pavex
is now more or less settled.
What's left? Dealing with all the ambiguous situations that arise!
An example:
- the top-level blueprint defines a constructor for a singleton type, u64.
- the nested blueprint overwrites it.
What should happen?
This is ambiguous!
The nested route expects a certain constructor to be used.
The parent route expects another one to be used.
But the type is supposed to be a singleton, we can't create it twice!
Introducing the concept of scopes to a codebase later in the game is always a messy business.
The implicit assumption that everyone can see everything has a way to percolate *everywhere*.
Why are we here?
#pavex needs to check at compile-time if your path extractor makes sense (i.e. does each field map to a route parameter?), which implies a way to go from a component to the relevant route.
E.g. RouteParams<HomeParams> => /home/:home_id
How difficult is it going to be to support trivial specialization in #pavex? I'm about to find out π₯
The idea being: you can register a generic constructor for a type (e.g. `Json<T>`) and provide a more specific one (e.g. `Json<u64>`) that will take precedence.
This is supposed to work exclusively in simplest case - i.e. your "more specific" constructor cannot have any unassigned generic type parameter.
Quite happy with how the route conflict error is shaping up in #pavex!
I have to do some work on sub-diagnostics (i.e. how to show multiple code snippets in a single error), but that's more of a general tech debt thing.
Kicking off a new experiment: monthly progress reports for #pavex.
The first alpha is months out, so I want to try to keep the project on people's mind in the meantime.
The first report is _almost_ ready to go. I managed to do the tough part, writing the introduction π
@dragnucs this is a bit of a blind guess, but perhaps look up #pavex by @algo_luca, from what I understand itβs going in that direction.