diff --git a/zbus_names/src/bus_name.rs b/zbus_names/src/bus_name.rs index a658b12f8..d5d92b763 100644 --- a/zbus_names/src/bus_name.rs +++ b/zbus_names/src/bus_name.rs @@ -4,7 +4,7 @@ use core::{ fmt::{self, Display, Formatter}, ops::Deref, }; -use std::{borrow::Cow, sync::Arc}; +use std::{borrow::Cow, convert::TryInto, sync::Arc}; use crate::{Error, OwnedUniqueName, OwnedWellKnownName, Result, UniqueName, WellKnownName}; use serde::{de, Deserialize, Serialize}; @@ -216,49 +216,26 @@ impl<'s> TryFrom<&'s str> for BusName<'s> { type Error = Error; fn try_from(value: &'s str) -> Result { - match UniqueName::try_from(value) { - Err(Error::InvalidUniqueName(unique_err)) => match WellKnownName::try_from(value) { - Err(Error::InvalidWellKnownName(well_known_err)) => { - Err(Error::InvalidBusName(unique_err, well_known_err)) - } - Err(e) => Err(e), - Ok(name) => Ok(BusName::WellKnown(name)), - }, - Err(e) => Err(e), - Ok(name) => Ok(BusName::Unique(name)), - } + let value: Str<'s> = value.into(); + value.try_into() } } -impl TryFrom for BusName<'_> { +impl<'s> TryFrom for BusName<'s> { type Error = Error; fn try_from(value: String) -> Result { - Ok(match BusName::try_from(value.as_str())? { - BusName::Unique(_) => BusName::Unique(UniqueName::from_string_unchecked(value)), - BusName::WellKnown(_) => { - BusName::WellKnown(WellKnownName::from_string_unchecked(value)) - } - }) + let value: Str<'s> = value.into(); + value.try_into() } } -impl TryFrom> for BusName<'_> { +impl<'s> TryFrom> for BusName<'s> { type Error = Error; fn try_from(value: Arc) -> Result { - // FIXME: Same as `str` impl above. Use a macro to avoid code duplication. - match UniqueName::try_from(value.clone()) { - Err(Error::InvalidUniqueName(unique_err)) => match WellKnownName::try_from(value) { - Err(Error::InvalidWellKnownName(well_known_err)) => { - Err(Error::InvalidBusName(unique_err, well_known_err)) - } - Err(e) => Err(e), - Ok(name) => Ok(BusName::WellKnown(name)), - }, - Err(e) => Err(e), - Ok(name) => Ok(BusName::Unique(name)), - } + let value: Str<'s> = value.into(); + value.try_into() } } @@ -266,13 +243,9 @@ impl<'s> TryFrom> for BusName<'s> { type Error = Error; fn try_from(value: Value<'s>) -> Result { - let value = Str::try_from(value)?; - Ok(match BusName::try_from(value.as_str())? { - BusName::Unique(_) => BusName::Unique(UniqueName::from_string_unchecked(value.into())), - BusName::WellKnown(_) => { - BusName::WellKnown(WellKnownName::from_string_unchecked(value.into())) - } - }) + Str::try_from(value) + .map_err(Into::into) + .and_then(TryInto::try_into) } } @@ -290,10 +263,8 @@ impl<'name> TryFrom> for BusName<'name> { type Error = Error; fn try_from(value: Cow<'name, str>) -> Result { - match value { - Cow::Borrowed(s) => Self::try_from(s), - Cow::Owned(s) => Self::try_from(s), - } + let value: Str<'name> = value.into(); + value.try_into() } } @@ -325,13 +296,8 @@ impl TryFrom for BusName<'static> { type Error = Error; fn try_from(value: OwnedValue) -> Result { - let value = Str::try_from(value)?; - Ok(match BusName::try_from(value.as_str())? { - BusName::Unique(_) => BusName::Unique(UniqueName::from_string_unchecked(value.into())), - BusName::WellKnown(_) => { - BusName::WellKnown(WellKnownName::from_string_unchecked(value.into())) - } - }) + let value: Str<'static> = value.try_into()?; + value.try_into() } }