91 lines · 2.1 KB · Rust
RawDownload
#![forbid(unsafe_code)]#![deny(rust_2018_idioms)] use std::{convert::TryFrom, fmt}; #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]pub enum Scheme {    File,    Git,    Ssh,    Http,    Https,} impl fmt::Display for Scheme {    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {        use Scheme::*;        f.write_str(match self {            File => "file",            Git => "git",            Ssh => "ssh",            Http => "http",            Https => "https",        })    }} #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]#[cfg_attr(feature = "serde1", derive(serde::Serialize, serde::Deserialize))]pub struct Url {    pub scheme: Scheme,    pub user: Option<String>,    pub host: Option<String>,    pub port: Option<u16>,    pub path: bstr::BString,} impl Default for Url {    fn default() -> Self {        Url {            scheme: Scheme::Ssh,            user: None,            host: None,            port: None,            path: bstr::BString::default(),        }    }} impl fmt::Display for Url {    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {        self.scheme.fmt(f)?;        f.write_str("://")?;        match (&self.user, &self.host) {            (Some(user), Some(host)) => f.write_fmt(format_args!("{}@{}", user, host)),            (None, Some(host)) => f.write_str(host),            (None, None) => Ok(()),            _ => return Err(fmt::Error),        }?;        if let Some(port) = &self.port {            f.write_char(':')?;            f.write_fmt(format_args!("{}", port))?;        }        f.write_str(self.path.to_str_lossy().as_ref())    }} impl Url {    pub fn from_bytes(url: &[u8]) -> Result<Self, parse::Error> {        parse(url)    }} impl TryFrom<&[u8]> for Url {    type Error = parse::Error;     fn try_from(value: &[u8]) -> Result<Self, Self::Error> {        Self::from_bytes(value)    }} pub mod expand_path;#[doc(inline)]pub use expand_path::expand_path; pub mod parse;use bstr::ByteSlice;#[doc(inline)]pub use parse::parse;use std::fmt::Write;