use super::{App, AppSetup, AppWebhook, SNI, SSL};
use std::collections::HashMap;
use crate::framework::endpoint::{HerokuEndpoint, Method};
pub struct AppCreate<'a> {
pub params: AppCreateParams<'a>,
}
#[cfg(feature = "builder")]
impl<'a> AppCreate<'a> {
pub fn new() -> AppCreate<'a> {
AppCreate {
params: AppCreateParams {
name: None,
region: None,
stack: None,
},
}
}
pub fn name(&mut self, name: &'a str) -> &mut Self {
self.params.name = Some(name);
self
}
pub fn region(&mut self, region: &'a str) -> &mut Self {
self.params.region = Some(region);
self
}
pub fn stack(&mut self, stack: &'a str) -> &mut Self {
self.params.stack = Some(stack);
self
}
pub fn build(&self) -> AppCreate<'a> {
AppCreate {
params: AppCreateParams {
name: self.params.name,
region: self.params.region,
stack: self.params.stack,
},
}
}
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug)]
pub struct AppCreateParams<'a> {
pub name: Option<&'a str>,
pub region: Option<&'a str>,
pub stack: Option<&'a str>,
}
impl<'a> HerokuEndpoint<App, (), AppCreateParams<'a>> for AppCreate<'a> {
fn method(&self) -> Method {
Method::Post
}
fn path(&self) -> String {
format!("apps")
}
fn body(&self) -> Option<AppCreateParams<'a>> {
Some(self.params.clone())
}
}
pub struct AppEnableAcm<'a> {
pub app_id: &'a str,
}
#[cfg(feature = "builder")]
impl<'a> AppEnableAcm<'a> {
pub fn new(app_id: &'a str) -> AppEnableAcm<'a> {
AppEnableAcm { app_id }
}
}
impl<'a> HerokuEndpoint<App> for AppEnableAcm<'a> {
fn method(&self) -> Method {
Method::Post
}
fn path(&self) -> String {
format!("apps/{}/acm", self.app_id)
}
}
pub struct AppWebhookCreate<'a> {
pub app_id: &'a str,
pub params: AppWebhookCreateParams<'a>,
}
#[cfg(feature = "builder")]
impl<'a> AppWebhookCreate<'a> {
pub fn new(
app_id: &'a str,
include: Vec<&'a str>,
level: &'a str,
url: &'a str,
) -> AppWebhookCreate<'a> {
AppWebhookCreate {
app_id: app_id,
params: AppWebhookCreateParams {
authorization: None,
include: include,
level: level,
secret: None,
url: url,
},
}
}
pub fn authorization(&mut self, authorization: &'a str) -> &mut Self {
self.params.authorization = Some(authorization);
self
}
pub fn secret(&mut self, secret: &'a str) -> &mut Self {
self.params.secret = Some(secret);
self
}
pub fn build(&self) -> AppWebhookCreate<'a> {
AppWebhookCreate {
app_id: self.app_id,
params: AppWebhookCreateParams {
authorization: self.params.authorization,
include: self.params.include.clone(),
level: self.params.level,
secret: self.params.secret,
url: self.params.url,
},
}
}
}
#[derive(Serialize, Clone, Debug)]
pub struct AppWebhookCreateParams<'a> {
pub authorization: Option<&'a str>,
pub include: Vec<&'a str>,
pub level: &'a str,
pub secret: Option<&'a str>,
pub url: &'a str,
}
impl<'a> HerokuEndpoint<AppWebhook, (), AppWebhookCreateParams<'a>> for AppWebhookCreate<'a> {
fn method(&self) -> Method {
Method::Post
}
fn path(&self) -> String {
format!("apps/{}/webhooks", self.app_id)
}
fn body(&self) -> Option<AppWebhookCreateParams<'a>> {
Some(self.params.clone())
}
}
pub struct AppSetupCreate<'a> {
pub params: AppSetupCreateParams<'a>,
}
#[cfg(feature = "builder")]
impl<'a> AppSetupCreate<'a> {
pub fn new(url: &'a str) -> AppSetupCreate<'a> {
AppSetupCreate {
params: AppSetupCreateParams {
app: SetupApp {
locked: None,
name: None,
organization: None,
personal: None,
region: None,
space: None,
stack: None,
},
source_blob: SourceBlob {
checksum: None,
url: url,
version: None,
},
overrides: Overrides {
buildpacks: None,
env: None,
},
},
}
}
pub fn version(&mut self, version: &'a str) -> &mut Self {
self.params.source_blob.version = Some(version);
self
}
pub fn checksum(&mut self, checksum: &'a str) -> &mut Self {
self.params.source_blob.checksum = Some(checksum);
self
}
pub fn locked(&mut self, locked: bool) -> &mut Self {
self.params.app.locked = Some(locked);
self
}
pub fn name(&mut self, name: &'a str) -> &mut Self {
self.params.app.name = Some(name);
self
}
pub fn organization(&mut self, organization: &'a str) -> &mut Self {
self.params.app.organization = Some(organization);
self
}
pub fn personal(&mut self, personal: bool) -> &mut Self {
self.params.app.personal = Some(personal);
self
}
pub fn region(&mut self, region: &'a str) -> &mut Self {
self.params.app.region = Some(region);
self
}
pub fn space(&mut self, space: &'a str) -> &mut Self {
self.params.app.space = Some(space);
self
}
pub fn stack(&mut self, stack: &'a str) -> &mut Self {
self.params.app.stack = Some(stack);
self
}
pub fn buildpacks(&mut self, buildpacks_list: Vec<&'a str>) -> &mut Self {
let mut buildpacks: Vec<Buildpack> = Vec::new();
for var in buildpacks_list {
buildpacks.push(Buildpack { url: var });
}
self.params.overrides.buildpacks = Some(buildpacks);
self
}
pub fn env(&mut self, env: HashMap<&'a str, &'a str>) -> &mut Self {
self.params.overrides.env = Some(env);
self
}
pub fn build(&self) -> AppSetupCreate<'a> {
AppSetupCreate {
params: AppSetupCreateParams {
app: self.params.app.clone(),
source_blob: self.params.source_blob.clone(),
overrides: self.params.overrides.clone(),
},
}
}
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug)]
pub struct AppSetupCreateParams<'a> {
pub app: SetupApp<'a>,
pub source_blob: SourceBlob<'a>,
pub overrides: Overrides<'a>,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug)]
pub struct SetupApp<'a> {
pub locked: Option<bool>,
pub name: Option<&'a str>,
pub organization: Option<&'a str>,
pub personal: Option<bool>,
pub region: Option<&'a str>,
pub space: Option<&'a str>,
pub stack: Option<&'a str>,
}
#[derive(Serialize, Clone, Debug)]
pub struct SourceBlob<'a> {
pub checksum: Option<&'a str>,
pub url: &'a str,
pub version: Option<&'a str>,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug)]
pub struct Overrides<'a> {
pub buildpacks: Option<Vec<Buildpack<'a>>>,
pub env: Option<HashMap<&'a str, &'a str>>,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug)]
pub struct Buildpack<'a> {
pub url: &'a str,
}
impl<'a> HerokuEndpoint<AppSetup, (), AppSetupCreateParams<'a>> for AppSetupCreate<'a> {
fn method(&self) -> Method {
Method::Post
}
fn path(&self) -> String {
format!("app-setups")
}
fn body(&self) -> Option<AppSetupCreateParams<'a>> {
Some(self.params.clone())
}
}
pub struct SNICreate<'a> {
pub app_id: &'a str,
pub params: SNICreateParams<'a>,
}
#[cfg(feature = "builder")]
impl<'a> SNICreate<'a> {
pub fn new(app_id: &'a str, certificate_chain: &'a str, private_key: &'a str) -> SNICreate<'a> {
SNICreate {
app_id,
params: SNICreateParams {
certificate_chain,
private_key,
},
}
}
}
#[derive(Serialize, Clone, Debug)]
pub struct SNICreateParams<'a> {
pub certificate_chain: &'a str,
pub private_key: &'a str,
}
impl<'a> HerokuEndpoint<SNI, (), SNICreateParams<'a>> for SNICreate<'a> {
fn method(&self) -> Method {
Method::Post
}
fn path(&self) -> String {
format!("apps/{}/sni-endpoints", self.app_id)
}
fn body(&self) -> Option<SNICreateParams<'a>> {
Some(self.params.clone())
}
}
pub struct SSLCreate<'a> {
pub app_id: &'a str,
pub params: SSLCreateParams<'a>,
}
#[cfg(feature = "builder")]
impl<'a> SSLCreate<'a> {
pub fn new(app_id: &'a str, certificate_chain: &'a str, private_key: &'a str) -> SSLCreate<'a> {
SSLCreate {
app_id,
params: SSLCreateParams {
certificate_chain: certificate_chain,
private_key: private_key,
preprocess: None,
},
}
}
pub fn preprocess(&mut self, preprocess: bool) -> &mut Self {
self.params.preprocess = Some(preprocess);
self
}
pub fn build(&self) -> SSLCreate<'a> {
SSLCreate {
app_id: self.app_id,
params: SSLCreateParams {
certificate_chain: self.params.certificate_chain,
private_key: self.params.private_key,
preprocess: self.params.preprocess,
},
}
}
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Clone, Debug)]
pub struct SSLCreateParams<'a> {
pub certificate_chain: &'a str,
pub private_key: &'a str,
pub preprocess: Option<bool>,
}
impl<'a> HerokuEndpoint<SSL, (), SSLCreateParams<'a>> for SSLCreate<'a> {
fn method(&self) -> Method {
Method::Post
}
fn path(&self) -> String {
format!("apps/{}/ssl-endpoints", self.app_id)
}
fn body(&self) -> Option<SSLCreateParams<'a>> {
Some(self.params.clone())
}
}