pub struct Rel(/* private fields */);Expand description
Link relation type.
WebFinger relation types are either absolute URI strings or IANA-registered relation type
names. RFC 7033 requires each rel member to contain exactly one relation type, so this type
rejects empty strings, relative URI references, and strings that try to carry multiple
relation types.
Rel serializes as a JSON string and implements AsRef<str> for comparison or lookup
without allocating. Builder methods accept strings for common use, but store this validated type
so deserialized and programmatically built links use the same representation.
Registered relation type names use the reg-rel-type syntax from RFC 5988 section 5.3.
URI-valued relation types are validated as absolute URI strings under RFC 3986, including the
section 2.1 percent-encoding rule.
§Examples
use webfinger_rs::Rel;
let registered = Rel::try_new("author")?;
let uri = Rel::try_new("http://webfinger.net/rel/profile-page")?;
assert_eq!(registered.as_ref(), "author");
assert_eq!(uri.as_ref(), "http://webfinger.net/rel/profile-page");Multiple relation types belong in multiple request rel parameters or multiple links, not in
one Rel value:
use webfinger_rs::Rel;
assert!(Rel::try_new("author avatar").is_err());Implementations§
Source§impl Rel
impl Rel
Sourcepub fn new<S: AsRef<str>>(rel: S) -> Self
pub fn new<S: AsRef<str>>(rel: S) -> Self
Creates a link relation type.
This constructor is convenient for application-controlled relation strings. Use
Rel::try_new when parsing external input.
§Panics
Panics if rel is not a URI relation type or registered relation type name. Use
Rel::try_new when handling untrusted input.
Examples found in repository?
68async fn webfinger(request: WebFingerRequest) -> actix_web::Result<WebFingerResponse> {
69 info!("fetching webfinger resource: {:?}", request);
70 let subject = request.resource.to_string();
71 if subject != SUBJECT {
72 let message = format!("{subject} does not exist");
73 return Err(actix_web::error::ErrorNotFound(message))?;
74 }
75 let mut links = Vec::new();
76
77 let profile_rel = Rel::new(PROFILE_PAGE_REL);
78 if request.rels.is_empty() || request.rels.contains(&profile_rel) {
79 links.push(
80 Link::builder(profile_rel)
81 .href(PROFILE_HREF)
82 .title("en", "Carol's profile")
83 .build(),
84 );
85 }
86
87 let avatar_rel = Rel::new(AVATAR_REL);
88 if request.rels.is_empty() || request.rels.contains(&avatar_rel) {
89 links.push(
90 Link::builder(avatar_rel)
91 .href(AVATAR_HREF)
92 .r#type("image/png")
93 .build(),
94 );
95 }
96
97 let response = WebFingerResponse::builder(subject)
98 .alias(PROFILE_HREF)
99 .property(ROLE_PROPERTY, "maintainer")
100 .links(links)
101 .build();
102 Ok(response)
103}More examples
71async fn webfinger(request: WebFingerRequest) -> axum::response::Result<WebFingerResponse> {
72 info!("fetching webfinger resource: {:?}", request);
73 let subject = request.resource.to_string();
74 if subject != SUBJECT {
75 let message = format!("{subject} does not exist");
76 return Err((StatusCode::NOT_FOUND, message).into());
77 }
78 let mut links = Vec::new();
79
80 let profile_rel = Rel::new(PROFILE_PAGE_REL);
81 if request.rels.is_empty() || request.rels.contains(&profile_rel) {
82 links.push(
83 Link::builder(profile_rel)
84 .href(PROFILE_HREF)
85 .title("en", "Carol's profile")
86 .build(),
87 );
88 }
89
90 let avatar_rel = Rel::new(AVATAR_REL);
91 if request.rels.is_empty() || request.rels.contains(&avatar_rel) {
92 links.push(
93 Link::builder(avatar_rel)
94 .href(AVATAR_HREF)
95 .r#type("image/png")
96 .build(),
97 );
98 }
99
100 let response = WebFingerResponse::builder(subject)
101 .alias(PROFILE_HREF)
102 .property(ROLE_PROPERTY, "maintainer")
103 .links(links)
104 .build();
105 Ok(response)
106}Sourcepub fn try_new<S: AsRef<str>>(rel: S) -> Result<Self, Error>
pub fn try_new<S: AsRef<str>>(rel: S) -> Result<Self, Error>
Tries to create a link relation type.
URI relation types must be absolute URI strings. Registered relation type names follow the
reg-rel-type syntax from RFC 5988: a lowercase ASCII letter followed by lowercase ASCII
letters, digits, ., or -.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Rel
impl<'de> Deserialize<'de> for Rel
Source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
impl Eq for Rel
Source§impl Ord for Rel
impl Ord for Rel
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialOrd for Rel
impl PartialOrd for Rel
impl StructuralPartialEq for Rel
Auto Trait Implementations§
impl Freeze for Rel
impl RefUnwindSafe for Rel
impl Send for Rel
impl Sync for Rel
impl Unpin for Rel
impl UnsafeUnpin for Rel
impl UnwindSafe for Rel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.