|
|
|
@ -1,19 +1,53 @@ |
|
|
|
|
use hex::ToHex; |
|
|
|
|
use serde::{Deserialize, Serialize}; |
|
|
|
|
use serde_with::{serde_as, DisplayFromStr}; |
|
|
|
|
use sha2::{Digest, Sha256}; |
|
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] |
|
|
|
|
pub struct DescrHttpProxyHeader { |
|
|
|
|
pub name: String, |
|
|
|
|
pub value: String, |
|
|
|
|
use crate::error::unexpected::{self, Mappable}; |
|
|
|
|
|
|
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Hash)] |
|
|
|
|
pub struct GitUrl { |
|
|
|
|
pub parsed: http::uri::Uri, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl std::str::FromStr for GitUrl { |
|
|
|
|
type Err = unexpected::Error; |
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> { |
|
|
|
|
let parsed: http::Uri = s |
|
|
|
|
.parse() |
|
|
|
|
.map_unexpected_while(|| format!("parsing as url"))?; |
|
|
|
|
|
|
|
|
|
let scheme = parsed |
|
|
|
|
.scheme() |
|
|
|
|
.map_unexpected_while(|| format!("extracting scheme"))?; |
|
|
|
|
|
|
|
|
|
if scheme != "http" && scheme != "https" { |
|
|
|
|
return Err(unexpected::Error::from( |
|
|
|
|
"only http(s) git URLs are supported", |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Ok(GitUrl { parsed }) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl std::fmt::Display for GitUrl { |
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
|
|
|
|
self.parsed.fmt(f) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[serde_as] |
|
|
|
|
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] |
|
|
|
|
#[serde(tag = "kind")] |
|
|
|
|
/// A unique description of an origin, from where a domain might be served.
|
|
|
|
|
pub enum Descr { |
|
|
|
|
#[serde(rename = "git")] |
|
|
|
|
Git { url: String, branch_name: String }, |
|
|
|
|
Git { |
|
|
|
|
#[serde_as(as = "DisplayFromStr")] |
|
|
|
|
url: GitUrl, |
|
|
|
|
branch_name: String, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl Descr { |
|
|
|
@ -29,7 +63,7 @@ impl Descr { |
|
|
|
|
match self { |
|
|
|
|
Descr::Git { url, branch_name } => { |
|
|
|
|
h_update("git"); |
|
|
|
|
h_update(url); |
|
|
|
|
h_update(url.parsed.to_string().as_str()); |
|
|
|
|
h_update(branch_name); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -45,11 +79,20 @@ mod descr_tests { |
|
|
|
|
fn id() { |
|
|
|
|
assert_eq!( |
|
|
|
|
super::Descr::Git { |
|
|
|
|
url: String::from("foo"), |
|
|
|
|
url: "https://foo".parse().unwrap(), |
|
|
|
|
branch_name: String::from("bar"), |
|
|
|
|
} |
|
|
|
|
.id(), |
|
|
|
|
"0b12637c1994e61db59ad9bea5fcaf5d2a1e5ecad00c58320271e721e4295ceb", |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
assert_eq!( |
|
|
|
|
super::Descr::Git { |
|
|
|
|
url: "http://foo".parse().unwrap(), |
|
|
|
|
branch_name: String::from("bar"), |
|
|
|
|
} |
|
|
|
|
.id(), |
|
|
|
|
"424130b9e6c1675c983b4b97579877e16d8a6377e4fe10970e6d210811c3b7ac", |
|
|
|
|
) |
|
|
|
|
"d14f4c75c938e46c2d9da05ea14b6e41ba86ac9945bb10c0b2f91faee1ec0bce", |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|