use super::Build;
use crate::framework::endpoint::{HerokuEndpoint, Method};
pub struct BuildCreate<'a> {
pub app_id: &'a str,
pub params: BuildCreateParams<'a>,
}
#[cfg(feature = "builder")]
impl<'a> BuildCreate<'a> {
pub fn new(app_id: &'a str, source_blob_url: &'a str) -> BuildCreate<'a> {
BuildCreate {
app_id,
params: BuildCreateParams {
buildpacks: None,
source_blob: SourceBlobParam {
checksum: None,
url: source_blob_url,
version: None,
},
},
}
}
pub fn checksum(&mut self, checksum: &'a str) -> &mut Self {
self.params.source_blob.checksum = Some(checksum);
self
}
pub fn version(&mut self, version: &'a str) -> &mut Self {
self.params.source_blob.version = Some(version);
self
}
pub fn buildpack(&mut self, url: &'a str, name: &'a str) -> &mut Self {
self.params.buildpacks = Some(vec![BuildpackParam { url, name }]);
self
}
pub fn build(&self) -> BuildCreate<'a> {
BuildCreate {
app_id: self.app_id,
params: BuildCreateParams {
buildpacks: self.params.buildpacks.clone(),
source_blob: SourceBlobParam {
checksum: self.params.source_blob.checksum,
url: self.params.source_blob.url,
version: self.params.source_blob.version,
},
},
}
}
}
#[derive(Serialize, Clone, Debug)]
pub struct BuildCreateParams<'a> {
pub buildpacks: Option<Vec<BuildpackParam<'a>>>,
pub source_blob: SourceBlobParam<'a>,
}
#[derive(Serialize, Clone, Debug)]
pub struct SourceBlobParam<'a> {
pub checksum: Option<&'a str>,
pub url: &'a str,
pub version: Option<&'a str>,
}
#[derive(Serialize, Clone, Debug)]
pub struct BuildpackParam<'a> {
pub url: &'a str,
pub name: &'a str,
}
impl<'a> HerokuEndpoint<Build, (), BuildCreateParams<'a>> for BuildCreate<'a> {
fn method(&self) -> Method {
Method::Post
}
fn path(&self) -> String {
format!("apps/{}/builds", self.app_id)
}
fn body(&self) -> Option<BuildCreateParams<'a>> {
Some(self.params.clone())
}
}