Skip to content

Commit

Permalink
zn: simplify TryFrom<_> for BusName imps
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxVerevkin committed Jun 21, 2023
1 parent bb65638 commit 7228ed9
Showing 1 changed file with 16 additions and 50 deletions.
66 changes: 16 additions & 50 deletions zbus_names/src/bus_name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -216,63 +216,36 @@ impl<'s> TryFrom<&'s str> for BusName<'s> {
type Error = Error;

fn try_from(value: &'s str) -> Result<Self> {
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<String> for BusName<'_> {
impl<'s> TryFrom<String> for BusName<'s> {
type Error = Error;

fn try_from(value: String) -> Result<Self> {
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<Arc<str>> for BusName<'_> {
impl<'s> TryFrom<Arc<str>> for BusName<'s> {
type Error = Error;

fn try_from(value: Arc<str>) -> Result<Self> {
// 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()
}
}

impl<'s> TryFrom<Value<'s>> for BusName<'s> {
type Error = Error;

fn try_from(value: Value<'s>) -> Result<Self> {
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)
}
}

Expand All @@ -290,10 +263,8 @@ impl<'name> TryFrom<Cow<'name, str>> for BusName<'name> {
type Error = Error;

fn try_from(value: Cow<'name, str>) -> Result<Self> {
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()
}
}

Expand Down Expand Up @@ -325,13 +296,8 @@ impl TryFrom<OwnedValue> for BusName<'static> {
type Error = Error;

fn try_from(value: OwnedValue) -> Result<Self> {
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()
}
}

Expand Down

0 comments on commit 7228ed9

Please sign in to comment.