Are you a dependency-conscious library author who is torn between manually implementing all the error handling boilerplate, and sacrificing compile times (syn, proc-macro2) by using [thiserror](https://github.com/dtolnay/thiserror)? Fear no more, because thiserror_lite is an almost drop-in replacement for thiserror with none of the compilation speed implications and zero dependencies. thiserror_lite builds upon dtolnays's amazing thiserror crate by reimplementing most functionality with 100% declarative macros. # Advantages - much faster compilation time - identical syntax \[check this later\] - passes thiserror's full test suite, when [accounting](INSERT LINK) for slight [usage differences](INSERT LINK) and [error message differences](INSERT LINK) \[check this later\] INSERT VIDEO HERE DEMONSTRATING MIGRATION FROM thiserror TO thiserror_lite ALSO, SHOULD THE NAME BE CHANGED TO thaterror OR SMTH ELSE? # Caveats Because of limitations in Rust's declarative macro system (`macro_rules!`), some trade-offs were made ## Different way of accessing variant fields in format string thiserror requires you to prefix names of fields with a dot: ```rust #[derive(thiserror::Error, Debug)] pub enum Error { #[error("x^2 = {}", .x * .x)] SomeNumber { x: i32 }, } ``` thiserror_lite removes the dot: ```rust #[derive(thiserror::Error, Debug)] pub enum Error { #[error("x^2 = {}", x * x)] SomeNumber { x: i32 }, } ``` If you were using this feature, you will need to adjust your code accordingly if you want to switch from thiserror to thiserror_lite ## No derive macro Rust macros can't provide `#\[derive\]` functionality. Hence thiserror_lite replaces the `#[derive(thiserror::Error)]` concept from thiserror with a wrapper macro: ```rust thiserror_lite::err_enum! { pub enum Error { // ... } } ``` ## No generics or lifetimes in error enums Due to an implementation detail that I got stuck on, thiserror_lite does not support generics or lifetimes on the produced enum \[check this later\] ## Max two fields in enum tuple variants Enum tuple variants with more than two \[check this later\] fields are not supported