rust/bt-gatt: Update Error semantics

Add From<&str> for convenience
Mark as #[non_exhaustive] to minimize API churn

Change-Id: Ife99fb490e5099d36a228fac440b1c6a4add67bd
Reviewed-on: https://bluetooth-review.git.corp.google.com/c/bluetooth/+/1681
Reviewed-by: Dayeong Lee <dayeonglee@google.com>
diff --git a/rust/bt-gatt/src/types.rs b/rust/bt-gatt/src/types.rs
index 84dae8a..cd052f2 100644
--- a/rust/bt-gatt/src/types.rs
+++ b/rust/bt-gatt/src/types.rs
@@ -133,6 +133,7 @@
 }
 
 #[derive(Error, Debug)]
+#[non_exhaustive]
 pub enum Error {
     #[error("peer {0} was not recognized")]
     PeerNotRecognized(PeerId),
@@ -148,6 +149,18 @@
     Gatt(#[from] GattError),
 }
 
+impl From<String> for Error {
+    fn from(value: String) -> Self {
+        Self::Other(Box::<dyn std::error::Error + Send + Sync>::from(value))
+    }
+}
+
+impl From<&str> for Error {
+    fn from(value: &str) -> Self {
+        String::from(value).into()
+    }
+}
+
 pub type Result<T> = core::result::Result<T, Error>;
 
 /// Handles are used as opaque identifiers for Characteristics and Descriptors.