Usage
```rust
extern crate todo;
fn myfunction() -> Result<(), String> {
TODO!(
"my_function
should return something _really groundbreaking";
Ok(())
)
}
fn main() { asserteq!(myfunction().unwrap(), ()); } ```
When compiled with debug assertions, the Ok(())
dummy value will be used and
your code will type-check and run without having to use unimplemented!()
(although if you don't provide the fallback value, it will fall back to using
unimplemented!()
with your TODO message).
When you build in release mode, though, with debug assertions on, you will get a compile-time error containing your TODO message.
It was motivated by a specific case at work where we had a bunch of structs, introduced a trait, and then split up the work of implementing that trait for each of the structs. One of those structs' implementations was call the implementation of another struct, but we totally forgot to do that since we didn't provide a dummy trait implementation on the other struct and then forgot to come back to the first structs' implementation.
That might not be the best pitch for this, but I think it might have helped.
Yes
Maybe. Hmm. Yeah, you might have a point there. If it's too annoyingly small to pull in as a crate, but you think it might be useful for something you're doing, you could just copy/paste the macro declaration into your crate (no hard feelings!):
```rust
macrorules! TODO { ($message:expr; $dummy:expr) => { compileerror!(concat!( "TODO: Must implement prior to release: ", $message )); }; ($message:expr;) => { compileerror!(concat!( "TODO: Must implement prior to release: ", $message )); }; ($message:expr) => { compileerror!(concat!( "TODO: Must implement prior to release: ", $message )); }; }
macro_rules! TODO { ($message:expr; $dummy:expr) => {{ $dummy }}; ($message:expr;) => {{ unimplemented!($message) }}; ($message:expr) => {{ unimplemented!($message) }}; } ```