#[cfg(feature = "alloc")]
use alloc::string::String;
#[inline]
pub(crate) fn split_fragment(iri: &str) -> (&str, Option<&str>) {
match iri.find('#') {
Some(colon_pos) => (&iri[..colon_pos], Some(&iri[(colon_pos + 1)..])),
None => (iri, None),
}
}
#[inline]
pub(crate) fn extract_fragment(iri: &str) -> Option<&str> {
split_fragment(iri).1
}
#[cfg(feature = "alloc")]
pub(crate) fn set_fragment(s: &mut String, fragment: Option<&str>) {
remove_fragment(s);
if let Some(fragment) = fragment {
s.reserve(fragment.len() + 1);
s.push('#');
s.push_str(fragment);
}
}
#[cfg(feature = "alloc")]
#[inline]
pub(crate) fn remove_fragment(s: &mut String) {
if let Some(colon_pos) = s.find('#') {
s.truncate(colon_pos);
}
}
#[cfg(feature = "alloc")]
pub(crate) fn split_fragment_owned(mut s: String) -> (String, Option<String>) {
let (prefix, fragment) = split_fragment(&s);
if fragment.is_none() {
return (s, None);
}
let prefix_len = prefix.len();
let fragment = s.split_off(prefix_len + 1);
{
let hash = s.pop();
assert_eq!(hash, Some('#'));
}
assert_eq!(s.len(), prefix_len);
(s, Some(fragment))
}