mod status;
mod standalone;
mod github;
mod gitlab;
#[cfg(test)]
pub mod testing;
pub mod prelude {
pub use providers::ProviderTrait;
pub use requests::{Request, RequestType};
pub use common::prelude::*;
pub use scripts::EnvBuilder;
}
pub use self::status::{StatusEvent, StatusEventKind, StatusProvider};
use requests::{Request, RequestType};
use common::prelude::*;
use scripts::EnvBuilder;
pub trait ProviderTrait: ::std::fmt::Debug {
fn new(&str) -> Result<Self>
where
Self: Sized;
fn validate(&self, &Request) -> RequestType;
fn build_env(&self, req: &Request, builder: &mut EnvBuilder) -> Result<()>;
fn trigger_status_hooks(&self, _req: &Request) -> bool {
true
}
}
macro_rules! ProviderEnum {
($($cfg:meta | $name:ident => $provider:path),*) => {
#[derive(Debug)]
pub enum Provider {
$(
#[cfg($cfg)]
$name($provider),
)*
}
impl Provider {
pub fn new(name: &str, config: &str) -> Result<Provider> {
match name {
$(
#[cfg($cfg)]
stringify!($name) => {
use $provider as InnerProvider;
match InnerProvider::new(config) {
Ok(prov) => Ok(Provider::$name(prov)),
Err(err) => Err(err),
}
},
)*
_ => Err(
ErrorKind::ProviderNotFound(name.to_string()).into()
),
}
}
pub fn validate(&self, req: &Request) -> RequestType {
match *self {
$(
#[cfg($cfg)]
Provider::$name(ref prov) => {
(prov as &ProviderTrait).validate(req)
},
)*
}
}
pub fn build_env(
&self, req: &Request, builder: &mut EnvBuilder,
) -> Result<()> {
match *self {
$(
#[cfg($cfg)]
Provider::$name(ref prov) => {
(prov as &ProviderTrait).build_env(req, builder)
},
)*
}
}
pub fn trigger_status_hooks(&self, req: &Request) -> bool {
match *self {
$(
#[cfg($cfg)]
Provider::$name(ref prov) => {
(prov as &ProviderTrait).trigger_status_hooks(req)
}
)*
}
}
#[allow(dead_code)]
pub fn name(&self) -> &str {
match *self {
$(
#[cfg($cfg)]
Provider::$name(..) => stringify!($name),
)*
}
}
}
};
}
ProviderEnum! {
any(test, not(test)) | Standalone => self::standalone::StandaloneProvider,
any(test, not(test)) | Status => self::status::StatusProvider,
any(test, not(test)) | GitHub => self::github::GitHubProvider,
any(test, not(test)) | GitLab => self::gitlab::GitLabProvider,
test | Testing => self::testing::TestingProvider
}