New codegen architecture
A new codegen architecture generating a whole crate instead of a single file #186.
Changes
- Generate a full crate instead of a file
- Inline clients code
- Minimum amount of dependencies
- Most features are now automatically enabled, only
deadpoolremain - Split the gigantic generated code file into modules
- No longer generate a named module for postgres
publicimplicit schema - Improve codegen
Current problems
- Cargo cannot have multiple package with the same name and doesn't support nested package. Therefore, I had to use a different name for each generated crate.
- We generate way more code than before, and codegen diff are getting out of control
Remaining improvements
- Test for types in a schema
- Update documentation, examples, website, etc
Deferred to future PR
- Use
cargo-pxinstead ofbuild.rsfor theauto-buildexample. Recommend this it by default instead of the cli ? - We have the opportunity to change how we handle certain types, in particular times #209 and decimals #204. We could provide options, for example for times, you could choose between : std for
SystemTime, time or chrono.
@LouisGariepy Although it is not completely ready for a merge, the core logic is already there and works. This is already a huge PR in itself, so I deferred some of the work for later. I didn't add any new features or made any logical changes to the generated code.
@Virgiel Thanks for the awesome work! I'm reviewing the code as I'm writing this. Might take a bit since there's a lot to look at, but what I have seen so far is promising.
Oh I just realized this was still a draft :sweat_smile:
I still need to add some error handling, but the new architecture is ready for review !
I've been using this PR in productions for a few weeks and it works very well !
A final pain point is that we generate too much code and it makes the PRs hard to read, I suggest putting the examples and reference codegen in gitignore and relying on cargo px to generate them on demand. We will continue to check that the codegen works and that the examples run.