use core::marker::PhantomData;
use nom::combinator::all_consuming;
use crate::{spec::Spec, types::RiReferenceStr};
use self::details::decompose_uri_reference;
pub(crate) use self::details::{absolute_uri, fragment, path, relative_ref, uri, uri_reference};
pub(crate) mod char;
mod details;
#[derive(Debug, Clone)]
#[cfg_attr(not(feature = "alloc"), allow(dead_code))]
pub(crate) struct RiReferenceComponents<'a, S> {
pub(crate) scheme: Option<&'a str>,
pub(crate) authority: Option<&'a str>,
pub(crate) path: &'a str,
pub(crate) query: Option<&'a str>,
pub(crate) fragment: Option<&'a str>,
pub(crate) _spec: PhantomData<fn() -> S>,
}
impl<'a, S: Spec> From<&'a RiReferenceStr<S>> for RiReferenceComponents<'a, S> {
fn from(s: &'a RiReferenceStr<S>) -> Self {
all_consuming(decompose_uri_reference::<(), S>)(s.as_str())
.map(|(_rest, components)| components)
.expect("Should never fail: `RiReferenceStr` should be already validated")
}
}