[![Latest Version]][crates.io] [![Documentation]][docs.rs] ![License]
This library provides `Ensure` trait that is useful for objects with unknown initial external state that can be brought to some target state.
This can be seen as `TryInto` trait for objects with side effects with unknown initial external state and desired target state.
For example a file may or may not exist. By implementing `Ensure` we can call `ensure()` to create new file only if it did not exist already.
Closures returning `CheckEnsureResult` that also return closure in `CheckEnsureResult::EnsureAction` variant automatically implement `Ensure` trait.
Helper function `ensure` can be used to call `ensure()` on such closure.
# Example
This program will create file only if it does not exist already.
```rust
use std::path::Path;
use std::fs::File;
use ensure::ensure;
use ensure::CheckEnsureResult::*;
fn main() {
let path = Path::new("/tmp/foo.txt");
ensure(|| {
Ok(if path.exists() {
Met(())
} else {
EnsureAction(|| {
File::create(&path).map(|file| drop(file))
})
})
}).expect("failed to create file");
}
```
[crates.io]: https://crates.io/crates/ensure
[Latest Version]: https://img.shields.io/crates/v/ensure.svg
[Documentation]: https://docs.rs/ensure/badge.svg
[docs.rs]: https://docs.rs/ensure
[License]: https://img.shields.io/crates/l/ensure.svg