use super::{ParsedSegments, Parser};
use crate::{ParseError, Provider};
use std::str;
use url::Url;
#[derive(Debug, Eq, PartialEq)]
pub struct GitHubParser {}
impl Parser for GitHubParser {
fn provider(&self) -> Provider {
Provider::GitHub
}
fn supports_scheme(&self, scheme: &str) -> bool {
matches!(
scheme,
"git" | "http" | "git+ssh" | "git+https" | "ssh" | "https"
)
}
fn extract<'a>(&self, url: &'a Url) -> Result<ParsedSegments<'a>, ParseError> {
let mut path_segments = url.path().splitn(5, '/');
let _ = path_segments.next();
let user = path_segments.next();
let project = path_segments.next();
let type_ = path_segments.next();
let mut committish = path_segments.next();
if let Some(type_) = type_ {
if type_ != "tree" {
return Err(ParseError::UnknownUrl);
}
} else {
committish = url.fragment();
}
let project = project.map(|project| project.strip_suffix(".git").unwrap_or(project));
if user.is_none() || project.is_none() {
return Err(ParseError::UnknownUrl);
}
Ok(ParsedSegments {
user,
project,
committish,
})
}
}