67 lines · 2.0 KB · Rust
RawDownload
/// A scheme or protocol for use in a [`Url`][crate::Url].////// It defines how to talk to a given repository.#[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone)]#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]pub enum Scheme {    /// A local resource that is accessible on the current host.    File,    /// A git daemon, like `File` over TCP/IP.    Git,    /// Launch `git-upload-pack` through an `ssh` tunnel.    Ssh,    /// Use the HTTP protocol to talk to git servers.    Http,    /// Use the HTTPS protocol to talk to git servers.    Https,    /// Any other protocol or transport that isn't known at compile time.    ///    /// It's used to support plug-in transports.    Ext(String),} impl<'a> From<&'a str> for Scheme {    fn from(value: &'a str) -> Self {        match value {            // "ssh+git" and "git+ssh" are legacy, but Git still allows them and so should we            "ssh" | "ssh+git" | "git+ssh" => Scheme::Ssh,            "file" => Scheme::File,            "git" => Scheme::Git,            "http" => Scheme::Http,            "https" => Scheme::Https,            unknown => Scheme::Ext(unknown.into()),        }    }} impl Scheme {    /// Return ourselves parseable name.    pub fn as_str(&self) -> &str {        use Scheme::*;        match self {            File => "file",            Git => "git",            Ssh => "ssh",            Http => "http",            Https => "https",            Ext(name) => name.as_str(),        }    }     /// Return the default port for this scheme, or `None` if it is not known.    pub fn default_port(&self) -> Option<u16> {        match self {            Scheme::Http => Some(80),            Scheme::Https => Some(443),            Scheme::Ssh => Some(22),            Scheme::Git => Some(9418),            _ => None,        }    }} impl std::fmt::Display for Scheme {    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {        f.write_str(self.as_str())    }}