#maybe #owned #cow


provides a MaybeOwned (and MaybeOwnedMut) type similar to std’s Cow but it implements From<T> and From<&'a T> and does not require ToOwned

5 releases

Uses old Rust 2015

0.3.4 May 23, 2020
0.3.3 May 22, 2020
0.3.2 Sep 8, 2018
0.3.0 Sep 6, 2017
0.2.0 May 17, 2017

#187 in Rust patterns

Download history 32018/week @ 2023-08-13 36889/week @ 2023-08-20 34811/week @ 2023-08-27 27878/week @ 2023-09-03 33931/week @ 2023-09-10 37237/week @ 2023-09-17 24637/week @ 2023-09-24 35827/week @ 2023-10-01 33954/week @ 2023-10-08 36364/week @ 2023-10-15 42833/week @ 2023-10-22 40105/week @ 2023-10-29 45376/week @ 2023-11-05 50419/week @ 2023-11-12 39091/week @ 2023-11-19 37196/week @ 2023-11-26

174,092 downloads per month
Used in 221 crates (16 directly)


712 lines

maybe-owned Build Status Crates.io maybe-owned maintenance License License

provides a MaybeOwned<'a,T> type different to std's Cow it implements From<T> and From<&'a T> and does not require ToOwned

This crate provides a MaybeOwned<'a,T> enum. Different to std::borrow::Cow it implements From<T> and From<&'a T> and does not require a ToOwned implementation. While this can be nice for API's mainly consuming T's not implementing ToOwned or implementing ToOwned through Clone it also means it's borrowed version of String is &String and not &str making it less performant for cases like String or Vec.

Documentation can be viewed on docs.rs.


Take a look at the examples dir and the documentation for more complete examples.

The main benefit of MaybeOwned over Cow is for API design, allowing API consumer to pass in both T and &'a T:

//... in a trait implementation
    fn register<D>(&mut self, key: SomeId, data: D)
        where D: Into<MaybeOwned<'a, Data>>

//... in usage
    // use owned data
    registry.register(id1, data_owned);
    // use a reference to the data
    registry.register(id2, &data_ref);
    // it ok to use the same reference again
    registry.register(id3, &data_ref);


Licensed under either of

at your option.


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.

Change Log

  • v0.3.4:

    • Added make_owned() as a to_mut() replacement, but also available for MaybeOwnedMut and more clear in it's functionality.
    • Added a as_mut() method to MaybeOwned which return a Option<&mut T>
    • Added missing BorrowMut implementation for MaybeOwnedMut
  • v0.3.3:

    • added MaybeOwnedMut
  • v0.3.2:

    • added transitive std::ops implementations
  • v0.3.1:

    • added serde support