diff --git a/src/bin/generic_trait_type_erasure.rs b/src/bin/generic_trait_type_erasure.rs new file mode 100644 index 0000000..1ab1bfb --- /dev/null +++ b/src/bin/generic_trait_type_erasure.rs @@ -0,0 +1,37 @@ + + +pub trait Repository { + type Key; + + fn get_data(&self, key: Self::Key) -> String; + fn set_data(&self, key: Self::Key, value: String); +} + +use std::any::Any; + +trait Key: Any { + fn as_any(&self) -> &dyn Any; + fn from_str(s: &str) -> Self where Self: Sized; + fn to_string(&self) -> String; +} + +impl Key for T { + fn as_any(&self) -> &dyn Any { + self + } +} + +impl Key for String { + fn from_str(s: &str) -> Self { + s.to_string() + } + + fn to_string(&self) -> String { + self.clone() + } +} + +pub trait RepositoryTypeErased { + fn get_data(&self, key: Key) -> String; + fn set_data(&self, key: Key, value: String); +} \ No newline at end of file