I have created a trait for transforming from some values to a type I need. That conversion is already covered by From/Into for many types, but not everything I want. I thought I could exploit this, but quickly got an error "upstream crates may add a new impl of trait".
(stripped-down example in the playground)
pub trait Cookable { fn cook(self) -> (String, Vec<i8>); } impl<T: Into<Vec<i8>>> Cookable for T { fn cook(self) -> (String, Vec<i8>) { (String::from("simple"), self.into()) } } impl Cookable for &str { fn cook(self) -> (String, Vec<i8>) { (String::from("smelly"), vec![self.len()]) } } That triggers the following error:
error[E0119]: conflicting implementations of trait `Cookable` for type `&str`: --> src/lib.rs:11:1 | 5 | impl<T: Into<Vec<i8>>> Cookable for T { | ------------------------------------- first implementation here ... 11 | impl Cookable for &str { | ^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&str` | = note: upstream crates may add a new impl of trait `std::convert::From<&str>` for type `std::vec::Vec<i8>` in future versions I am worried that the only way to work around this error is to specify individual trait implementations for every one of the types that already has an Into.