Struct RiRelativeString

struct RiRelativeString<S> { ... }

An owned string of a relative IRI reference.

This corresponds to irelative-ref rule in RFC 3987 (and relative-ref rule in RFC 3986). The rule for irelative-ref is irelative-part [ "?" iquery ] [ "#" ifragment ].

For details, see the document for RiRelativeStr.

Enabled by alloc or std feature.

Implementations

impl RiRelativeString<IriSpec>

fn encode_to_uri_inline(self: &mut Self)

Percent-encodes the IRI into a valid URI that identifies the equivalent resource.

After the encode, the IRI is also a valid URI.

If you want a new URI string rather than modifying the IRI string, or if you need more precise control over memory allocation and buffer handling, use [encode_to_uri]IriRelativeStr::encode_to_uri method.

Panics

Panics if the memory allocation failed.

Examples

# use iri_string::validate::Error;
#[cfg(feature = "alloc")] {
use iri_string::types::IriRelativeString;

let mut iri = IriRelativeString::try_from("../?alpha=\u{03B1}")?;
iri.encode_to_uri_inline();
assert_eq!(iri, "../?alpha=%CE%B1");
# }
# Ok::<_, Error>(())
fn try_encode_to_uri_inline(self: &mut Self) -> Result<(), TryReserveError>

Percent-encodes the IRI into a valid URI that identifies the equivalent resource.

After the encode, the IRI is also a valid URI.

If you want a new URI string rather than modifying the IRI string, or if you need more precise control over memory allocation and buffer handling, use [encode_to_uri]IriRelativeStr::encode_to_uri method.

Examples

# use iri_string::validate::Error;
#[cfg(feature = "alloc")] {
use iri_string::types::IriRelativeString;

let mut iri = IriRelativeString::try_from("../?alpha=\u{03B1}")?;
iri.try_encode_to_uri_inline()
    .expect("failed to allocate memory");
assert_eq!(iri, "../?alpha=%CE%B1");
# }
# Ok::<_, Error>(())
fn encode_into_uri(self: Self) -> UriRelativeString

Percent-encodes the IRI into a valid URI that identifies the equivalent resource.

If you want a new URI string rather than modifying the IRI string, or if you need more precise control over memory allocation and buffer handling, use [encode_to_uri]IriRelativeStr::encode_to_uri method.

Examples

# use iri_string::validate::Error;
#[cfg(feature = "alloc")] {
use iri_string::types::{IriRelativeString, UriRelativeString};

let iri = IriRelativeString::try_from("../?alpha=\u{03B1}")?;
// Type annotation here is not necessary.
let uri: UriRelativeString = iri.encode_into_uri();
assert_eq!(uri, "../?alpha=%CE%B1");
# }
# Ok::<_, Error>(())
fn try_encode_into_uri(self: Self) -> Result<UriRelativeString, TryReserveError>

Percent-encodes the IRI into a valid URI that identifies the equivalent resource.

If you want a new URI string rather than modifying the IRI string, or if you need more precise control over memory allocation and buffer handling, use [encode_to_uri]IriRelativeStr::encode_to_uri method.

Examples

# use iri_string::validate::Error;
#[cfg(feature = "alloc")] {
use iri_string::types::{IriRelativeString, UriRelativeString};

let iri = IriRelativeString::try_from("../?alpha=\u{03B1}")?;
// Type annotation here is not necessary.
let uri: UriRelativeString = iri.try_encode_into_uri()
    .expect("failed to allocate memory");
assert_eq!(uri, "../?alpha=%CE%B1");
# }
# Ok::<_, Error>(())
fn try_into_uri(self: Self) -> Result<UriRelativeString, IriRelativeString>

Converts an IRI into a URI without modification, if possible.

Examples

# use iri_string::validate::Error;
use iri_string::types::{IriRelativeString, UriRelativeString};

let ascii_iri = IriRelativeString::try_from("../?alpha=%CE%B1")?;
assert_eq!(
    ascii_iri.try_into_uri().map(|uri| uri.to_string()),
    Ok("../?alpha=%CE%B1".to_string())
);

let nonascii_iri = IriRelativeString::try_from("../?alpha=\u{03B1}")?;
assert_eq!(
    nonascii_iri.try_into_uri().map_err(|iri| iri.to_string()),
    Err("../?alpha=\u{03B1}".to_string())
);
# Ok::<_, Error>(())

impl<S: Spec> RiRelativeString<S>

fn set_fragment(self: &mut Self, fragment: Option<&RiFragmentStr<S>>)

Sets the fragment part to the given string.

Removes fragment part (and following # character) if None is given.

Examples

# use iri_string::validate::Error;
# #[cfg(feature = "alloc")] {
use iri_string::types::{IriFragmentStr, IriRelativeString};

let mut iri = IriRelativeString::try_from("//user:password@example.com/path?query#frag.old")?;
assert_eq!(iri.fragment_str(), Some("frag.old"));

iri.set_fragment(None);
assert_eq!(iri.fragment(), None);

let frag_new = IriFragmentStr::new("frag-new")?;
iri.set_fragment(Some(frag_new));
assert_eq!(iri.fragment_str(), Some("frag-new"));
# }
# Ok::<_, Error>(())

Fragment can be empty, and it is distinguished from the absense of a fragment.

# use iri_string::validate::Error;
# #[cfg(feature = "alloc")] {
use iri_string::types::IriRelativeString;

let mut iri = IriRelativeString::try_from("/path#")?;
assert_eq!(iri, "/path#");
assert_eq!(iri.fragment_str(), Some(""), "Fragment is present and empty");

iri.set_fragment(None);
assert_eq!(iri, "/path", "Note that # is now removed");
assert_eq!(iri.fragment_str(), None, "Fragment is absent");
# }
# Ok::<_, Error>(())
fn remove_password_inline(self: &mut Self)

Removes the password completely (including separator colon) from self even if it is empty.

Examples

# use iri_string::validate::Error;
# #[cfg(feature = "alloc")] {
use iri_string::types::IriRelativeString;

let mut iri = IriRelativeString::try_from("//user:password@example.com/path?query")?;
iri.remove_password_inline();
assert_eq!(iri, "//user@example.com/path?query");
# }
# Ok::<_, Error>(())

Even if the password is empty, the password and separator will be removed.

# use iri_string::validate::Error;
# #[cfg(feature = "alloc")] {
use iri_string::types::IriRelativeString;

let mut iri = IriRelativeString::try_from("//user:@example.com/path?query")?;
iri.remove_password_inline();
assert_eq!(iri, "//user@example.com/path?query");
# }
# Ok::<_, Error>(())
fn remove_nonempty_password_inline(self: &mut Self)

Replaces the non-empty password in self to the empty password.

This leaves the separator colon if the password part was available.

Examples

# use iri_string::validate::Error;
# #[cfg(feature = "alloc")] {
use iri_string::types::IriRelativeString;

let mut iri = IriRelativeString::try_from("//user:password@example.com/path?query")?;
iri.remove_nonempty_password_inline();
assert_eq!(iri, "//user:@example.com/path?query");
# }
# Ok::<_, Error>(())

If the password is empty, it is left as is.

# use iri_string::validate::Error;
# #[cfg(feature = "alloc")] {
use iri_string::types::IriRelativeString;

let mut iri = IriRelativeString::try_from("//user:@example.com/path?query")?;
iri.remove_nonempty_password_inline();
assert_eq!(iri, "//user:@example.com/path?query");
# }
# Ok::<_, Error>(())

impl<S: crate::spec::Spec> RiRelativeString<S>

unsafe fn new_unchecked(s: String) -> Self

Creates a new string without validation.

This does not validate the given string, so it is caller's responsibility to ensure the given string is valid.

Safety

The given string must be syntactically valid as Self type. If not, any use of the returned value or the call of this function itself may result in undefined behavior.

fn shrink_to_fit(self: &mut Self)

Shrinks the capacity of the inner buffer to match its length.

fn capacity(self: &Self) -> usize

Returns the internal buffer capacity in bytes.

fn as_slice(self: &Self) -> &RiRelativeStr<S>

Returns the borrowed IRI string slice.

This is equivalent to &*self.

impl<P, T> Receiver for RiRelativeString<S>

impl<S> Freeze for RiRelativeString<S>

impl<S> RefUnwindSafe for RiRelativeString<S>

impl<S> Send for RiRelativeString<S>

impl<S> Sync for RiRelativeString<S>

impl<S> Unpin for RiRelativeString<S>

impl<S> UnsafeUnpin for RiRelativeString<S>

impl<S> UnwindSafe for RiRelativeString<S>

impl<S: Spec> From for RiRelativeString<S>

fn from(builder: &Built<'_, RiRelativeStr<S>>) -> Self

impl<S: Spec> From for RiRelativeString<S>

fn from(builder: Built<'_, RiRelativeStr<S>>) -> Self

impl<S: Spec, C: Context> TryFrom for RiRelativeString<S>

fn try_from(v: Expanded<'_, S, C>) -> Result<Self, <Self as >::Error>

impl<S: crate::spec::Spec> AsRef for RiRelativeString<S>

fn as_ref(self: &Self) -> &RiRelativeStr<S>

impl<S: crate::spec::Spec> AsRef for RiRelativeString<S>

fn as_ref(self: &Self) -> &str

impl<S: crate::spec::Spec> AsRef for RiRelativeString<S>

fn as_ref(self: &Self) -> &RiReferenceStr<S>

impl<S: crate::spec::Spec> Borrow for RiRelativeString<S>

fn borrow(self: &Self) -> &RiRelativeStr<S>

impl<S: crate::spec::Spec> Borrow for RiRelativeString<S>

fn borrow(self: &Self) -> &str

impl<S: crate::spec::Spec> Clone for RiRelativeString<S>

fn clone(self: &Self) -> Self

impl<S: crate::spec::Spec> Debug for RiRelativeString<S>

fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result

impl<S: crate::spec::Spec> Deref for RiRelativeString<S>

fn deref(self: &Self) -> &RiRelativeStr<S>

impl<S: crate::spec::Spec> Display for RiRelativeString<S>

fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result

impl<S: crate::spec::Spec> Eq for RiRelativeString<S>

impl<S: crate::spec::Spec> From for RiRelativeString<S>

fn from(s: &RiRelativeStr<S>) -> Self

impl<S: crate::spec::Spec> FromStr for RiRelativeString<S>

fn from_str(s: &str) -> Result<Self, <Self as >::Err>

impl<S: crate::spec::Spec> Hash for RiRelativeString<S>

fn hash<H: core::hash::Hasher>(self: &Self, state: &mut H)

impl<S: crate::spec::Spec> Ord for RiRelativeString<S>

fn cmp(self: &Self, other: &Self) -> Ordering

impl<S: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, o: &String) -> bool

impl<S: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, o: &Cow<'_, str>) -> bool

impl<S: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, o: &&str) -> bool

impl<S: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, o: &str) -> bool

impl<S: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, o: &String) -> Option<Ordering>

impl<S: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, o: &Cow<'_, str>) -> Option<Ordering>

impl<S: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, o: &&str) -> Option<Ordering>

impl<S: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, o: &str) -> Option<Ordering>

impl<S: crate::spec::Spec> TryFrom for RiRelativeString<S>

fn try_from(s: &str) -> Result<Self, <Self as >::Error>

impl<S: crate::spec::Spec> TryFrom for RiRelativeString<S>

fn try_from(bytes: &[u8]) -> Result<Self, <Self as >::Error>

impl<S: crate::spec::Spec> TryFrom for RiRelativeString<S>

fn try_from(s: RiReferenceString<S>) -> Result<Self, <Self as >::Error>

impl<S: crate::spec::Spec> TryFrom for RiRelativeString<S>

fn try_from(s: String) -> Result<Self, <Self as >::Error>

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, o: &RiReferenceString<T>) -> bool

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, o: &&RiReferenceStr<T>) -> bool

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, o: &RiReferenceStr<T>) -> bool

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, other: &RiRelativeString<T>) -> bool

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialEq for RiRelativeString<S>

fn eq(self: &Self, o: &Cow<'_, RiReferenceStr<T>>) -> bool

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialEq for RiRelativeString<T>

fn eq(self: &Self, o: &Cow<'_, RiRelativeStr<S>>) -> bool

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialEq for RiRelativeString<T>

fn eq(self: &Self, o: &&RiRelativeStr<S>) -> bool

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialEq for RiRelativeString<T>

fn eq(self: &Self, o: &RiRelativeStr<S>) -> bool

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, o: &Cow<'_, RiReferenceStr<T>>) -> Option<Ordering>

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, o: &RiReferenceString<T>) -> Option<Ordering>

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, other: &RiRelativeString<T>) -> Option<Ordering>

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, o: &&RiReferenceStr<T>) -> Option<Ordering>

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialOrd for RiRelativeString<S>

fn partial_cmp(self: &Self, o: &RiReferenceStr<T>) -> Option<Ordering>

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialOrd for RiRelativeString<T>

fn partial_cmp(self: &Self, o: &Cow<'_, RiRelativeStr<S>>) -> Option<Ordering>

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialOrd for RiRelativeString<T>

fn partial_cmp(self: &Self, o: &&RiRelativeStr<S>) -> Option<Ordering>

impl<S: crate::spec::Spec, T: crate::spec::Spec> PartialOrd for RiRelativeString<T>

fn partial_cmp(self: &Self, o: &RiRelativeStr<S>) -> Option<Ordering>

impl<T> Any for RiRelativeString<S>

fn type_id(self: &Self) -> TypeId

impl<T> Borrow for RiRelativeString<S>

fn borrow(self: &Self) -> &T

impl<T> BorrowMut for RiRelativeString<S>

fn borrow_mut(self: &mut Self) -> &mut T

impl<T> CloneToUninit for RiRelativeString<S>

unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)

impl<T> From for RiRelativeString<S>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> ToOwned for RiRelativeString<S>

fn to_owned(self: &Self) -> T
fn clone_into(self: &Self, target: &mut T)

impl<T> ToString for RiRelativeString<S>

fn to_string(self: &Self) -> String

impl<T> ToStringFallible for RiRelativeString<S>

fn try_to_string(self: &Self) -> Result<String, TryReserveError>

[ToString::to_string]alloc::string::ToString::to_string, but without panic on OOM.

impl<T, U> Into for RiRelativeString<S>

fn into(self: Self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom for RiRelativeString<S>

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

impl<T, U> TryInto for RiRelativeString<S>

fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>