zbus_names/
error_name.rs

1use crate::{Error, Result, utils::define_name_type_impls};
2use serde::Serialize;
3use zvariant::{OwnedValue, Str, Type, Value};
4
5/// String that identifies an [error name][en] on the bus.
6///
7/// Error names have same constraints as interface names.
8///
9/// # Examples
10///
11/// ```
12/// use zbus_names::ErrorName;
13///
14/// // Valid error names.
15/// let name = ErrorName::try_from("org.gnome.Error_for_you").unwrap();
16/// assert_eq!(name, "org.gnome.Error_for_you");
17/// let name = ErrorName::try_from("a.very.loooooooooooooooooo_ooooooo_0000o0ng.ErrorName").unwrap();
18/// assert_eq!(name, "a.very.loooooooooooooooooo_ooooooo_0000o0ng.ErrorName");
19///
20/// // Invalid error names
21/// ErrorName::try_from("").unwrap_err();
22/// ErrorName::try_from(":start.with.a.colon").unwrap_err();
23/// ErrorName::try_from("double..dots").unwrap_err();
24/// ErrorName::try_from(".").unwrap_err();
25/// ErrorName::try_from(".start.with.dot").unwrap_err();
26/// ErrorName::try_from("no-dots").unwrap_err();
27/// ErrorName::try_from("1st.element.starts.with.digit").unwrap_err();
28/// ErrorName::try_from("the.2nd.element.starts.with.digit").unwrap_err();
29/// ErrorName::try_from("contains.dashes-in.the.name").unwrap_err();
30/// ```
31///
32/// [en]: https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-error
33#[derive(
34    Clone, Debug, Hash, PartialEq, Eq, Serialize, Type, Value, PartialOrd, Ord, OwnedValue,
35)]
36pub struct ErrorName<'name>(Str<'name>);
37
38/// Owned sibling of [`ErrorName`].
39#[derive(Clone, Hash, PartialEq, Eq, Serialize, Type, Value, PartialOrd, Ord, OwnedValue)]
40pub struct OwnedErrorName(#[serde(borrow)] ErrorName<'static>);
41
42define_name_type_impls! {
43    name: ErrorName,
44    owned: OwnedErrorName,
45    validate: validate,
46}
47
48fn validate(name: &str) -> Result<()> {
49    // Error names follow the same rules as interface names.
50    crate::interface_name::validate_bytes(name.as_bytes()).map_err(|_| {
51        Error::InvalidName(
52            "Invalid error name. See \
53            https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-error",
54        )
55    })
56}