Rewrite for better ergonomics and type safety
This library does some pretty sketchy things internally (abuse of the Deref and DerefMut traits plus some weird, but sound, uses of std::mem::transmute() to simulate inheritance, etc), and its user ergonomics aren't the best either. I've learned quite a lot since I first started this project, and I would like to completely redo this library to make better use of the type system and be more user-friendly.
For one, it is possible to fully reimplement this style of API using 100% safe and idiomatic code (Playground link), while also fixing #93. Other aspects of this library could use a lick of paint; for example, the CaptureOptions interface of the raw RenderDoc API could be abstracted over with a type safe interface, and the frame capture methods could be made more idiomatic too (consider providing a Drop guard for starting and ending a frame capture, for instance).
Finally, the RenderDoc<V> struct could offer a default generic type parameter which defaults to the newest supported API version to make things easier for users who don't really care about selecting a specific API version themselves.
The whole type-safe runtime downgrading API with .into() is honestly an unnecessary gimmick and should be removed. But perhaps offering a fallible API for users to upgrade their RenderDoc<V> instance to a newer version, if they so choose, would be more useful (one would select a minimum supported version first, and if so desired, test at runtime whether RenderDoc handed over a newer version and then switch to that).
There is a work-in-progress branch named improve-api-ergonomics which contains a significant rewrite of this library. It includes, among other things:
- A proper data model for
Versions which usesMinimum<V>andBelow<V>trait bounds to conditionally enable and disable methodsRenderDoc<V>.- No more abusing
std::ops::{Deref, DerefMut}and sound (but scary) transmutation. - Renamed methods (e.g.
shutdown->remove_hooks) are expressible, fixing #93.
- No more abusing
- A type safe way of upgrading the minimum supported version at runtime.
- The downgrading mechanism has been removed entirely.
- Better organization of modules.
- Strongly typed and versioned capture options.
- Prettier
Debugoutput forRenderDoc<V>and other versioned types. - No more heap allocations when passing
InputButtons intoset_{focus_toggle,capture}_keys(). - Clearer documentation, more doctests.
- Pruned unnecessary items from the public API surface (no more
VersionCodeenum, no moreHasPrevioustrait).-
AsInputButtonsremains public so users checking therustdocoutput can see a list of types that implement it.
-
More ergonomics improvements to come.