@@ -3,6 +3,7 @@ use dbus::Path;
33use dbus:: arg:: { PropMap , RefArg , Variant , cast} ;
44use serde:: { Deserialize , Serialize } ;
55use std:: collections:: HashMap ;
6+ use std:: convert:: TryFrom ;
67use std:: fmt:: { self , Display , Formatter } ;
78use std:: str:: FromStr ;
89use uuid:: Uuid ;
@@ -41,6 +42,16 @@ impl From<DeviceId> for Path<'static> {
4142 }
4243}
4344
45+ impl TryFrom < & str > for DeviceId {
46+ type Error = dbus:: Error ;
47+
48+ fn try_from ( s : & str ) -> Result < Self , Self :: Error > {
49+ let path = Path :: try_from ( format ! ( "/org/bluez/{}" , s) )
50+ . map_err ( |_| dbus:: Error :: new_failed ( "Invalid D-Bus path" ) ) ?;
51+ Ok ( DeviceId { object_path : path. into_static ( ) } )
52+ }
53+ }
54+
4455impl Display for DeviceId {
4556 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmt:: Result {
4657 write ! (
@@ -296,6 +307,12 @@ mod tests {
296307 assert_eq ! ( device_id. to_string( ) , "hci0/dev_11_22_33_44_55_66" ) ;
297308 }
298309
310+ #[ test]
311+ fn from_string ( ) {
312+ let device_id = DeviceId :: try_from ( "hci0/dev_11_22_33_44_55_66" ) ;
313+ assert_eq ! ( device_id. unwrap( ) . to_string( ) , "hci0/dev_11_22_33_44_55_66" ) ;
314+ }
315+
299316 #[ test]
300317 fn service_data ( ) {
301318 let uuid = uuid_from_u32 ( 0x11223344 ) ;
0 commit comments