# Maybe Owned values
This crate provides two simple wrappers
[`Mown`](https://docs.rs/mown/latest/mown/enum.Mown.html)
and
[`MownMut`](https://docs.rs/mown/latest/mown/enum.MownMut.html)
for values that can be either owned or borrowed.
The type `Mown` is an simple `enum` type with two constructors:
```rust
pub trait Borrowed {
type Owned: Borrow;
}
pub enum Mown<'a, T: Borrowed> {
Owned(T::Owned),
Borrowed(&'a T)
}
```
The mutable version `MownMut` follows the same definition with a mutable
reference.
This is very similar to the standard
[`Cow`](https://doc.rust-lang.org/std/borrow/enum.Cow.html)
type, except that it is not possible to transform a borrowed value into an owned
one.
This is also slightly different from the similar crate
[`boow`](https://crates.io/crates/boow)
since the [`ToOwned`] trait allow for the use of `Mown` with unsized types
(for instance `Mown`) and with mutable references.
### Basic Usage
One basic use case for the `Mown` type is the situation where one wants to
reuse some input borrowed value under some condition, or then use a custom
owned value.
```rust
use mown::Mown;
fn function(input_value: &String) -> Mown {
if condition {
Mown::Borrowed(input_value)
} else {
let custom_value: String = "foo_".to_string() + input_value + "_bar";
Mown::Owned(custom_value)
}
}
```
One can also wrap unsized types for which the provided [`ToOwned`]
trait has been implemented.
This is the case for the unsized `str` type with the sized owned type `String`.
```rust
use mown::Mown;
fn function(input_value: &str) -> Mown {
if condition {
Mown::Borrowed(input_value)
} else {
let custom_value: String = "foo_".to_string() + input_value + "_bar";
Mown::Owned(custom_value)
}
}
```
## License
Licensed under either of
* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
### Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
additional terms or conditions.