use crate::types::uri::relative::RelativeUri;
use crate::{ErrorKind, Uri};
use url::ParseError;
pub enum ParsedUri<'a> {
Absolute(Uri),
Relative(RelativeUri<'a>),
}
impl<'a> ParsedUri<'a> {
pub fn parse(text: &'a str) -> Result<Self, ErrorKind> {
let text = text.trim_ascii_start();
match Uri::try_from(text) {
Ok(uri) => Ok(ParsedUri::Absolute(uri)),
Err(ErrorKind::ParseUrl(ParseError::RelativeUrlWithoutBase, _)) => {
Ok(ParsedUri::Relative(RelativeUri::parse(text)))
}
Err(e) => Err(e),
}
}
}
impl<'a> TryFrom<&'a str> for ParsedUri<'a> {
type Error = ErrorKind;
fn try_from(text: &'a str) -> Result<Self, Self::Error> {
ParsedUri::parse(text)
}
}