mod client;
mod registry;
mod server;
pub use client::*;
pub use registry::*;
pub use server::*;
pub trait SchemeId {
fn namespace(&self) -> &str;
fn scheme(&self) -> &str;
fn caip_family(&self) -> String {
format!("{}:*", self.namespace())
}
fn id(&self) -> String {
format!("{}-{}", self.namespace(), self.scheme())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ExactScheme;
impl ExactScheme {
pub const VALUE: &'static str = "exact";
}
impl std::fmt::Display for ExactScheme {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(Self::VALUE)
}
}
impl AsRef<str> for ExactScheme {
fn as_ref(&self) -> &str {
Self::VALUE
}
}
impl std::str::FromStr for ExactScheme {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s == Self::VALUE {
Ok(Self)
} else {
Err(format!("expected '{}', got '{s}'", Self::VALUE))
}
}
}
impl serde::Serialize for ExactScheme {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(Self::VALUE)
}
}
impl<'de> serde::Deserialize<'de> for ExactScheme {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let s = String::deserialize(deserializer)?;
if s == Self::VALUE {
Ok(Self)
} else {
Err(serde::de::Error::custom(format!(
"expected '{}', got '{s}'",
Self::VALUE,
)))
}
}
}