aboutsummaryrefslogtreecommitdiffstats
path: root/src/url.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/url.rs')
-rw-r--r--src/url.rs78
1 files changed, 0 insertions, 78 deletions
diff --git a/src/url.rs b/src/url.rs
deleted file mode 100644
index 31a0536..0000000
--- a/src/url.rs
+++ /dev/null
@@ -1,78 +0,0 @@
-use std::fmt;
-use std::str::FromStr;
-
-use url::{self,ParseError};
-use serde_derive::Serialize;
-
-
-fn starts_with_scheme(input: &str) -> bool {
- let scheme = input.split(':').next().unwrap();
- if scheme == input || scheme.is_empty() {
- return false;
- }
- let mut chars = input.chars();
- // First character.
- if !chars.next().unwrap().is_ascii_alphabetic() {
- return false;
- }
- for ch in chars {
- if !ch.is_ascii_alphanumeric() && ch != '+' && ch != '-' && ch != '.' {
- return false;
- }
- }
- true
-}
-
-/// The string representation of a URL, either absolute or relative, that has
-/// been verified as a valid URL on construction.
-#[derive(Debug,PartialEq,Serialize,Clone)]
-#[serde(transparent)]
-pub struct Url(String);
-
-impl Url {
- pub fn parse_absolute(input: &str) -> Result<Self, ParseError> {
- Ok(url::Url::parse(input)?.into())
- }
- pub fn parse_relative(input: &str) -> Result<Self, ParseError> {
- // We're assuming that any scheme through which RsT documents are being
- // accessed is a hierarchical scheme, and so we can parse relative to a
- // random hierarchical URL.
- if input.starts_with('/') || !starts_with_scheme(input) {
- // Continue only if the parse succeeded, disregarding its result.
- let random_base_url = url::Url::parse("https://a/b").unwrap();
- url::Url::options()
- .base_url(Some(&random_base_url))
- .parse(input)?;
- Ok(Url(input.into()))
- } else {
- // If this is a URL at all, it's an absolute one.
- // There's no appropriate variant of url::ParseError really.
- Err(ParseError::SetHostOnCannotBeABaseUrl)
- }
- }
- pub fn as_str(&self) -> &str {
- self.0.as_str()
- }
-}
-
-impl From<url::Url> for Url {
- fn from(url: url::Url) -> Self {
- Url(url.into_string())
- }
-}
-
-
-impl fmt::Display for Url {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{}", self.as_str())
- }
-}
-
-
-impl FromStr for Url {
- type Err = ParseError;
- fn from_str(input: &str) -> Result<Self, Self::Err> {
- Url::parse_absolute(input)
- .or_else(|_| Url::parse_relative(input))
- }
-}