use crate::custom_serde::{codebuild_time, CodeBuildNumber};
use crate::encodings::{MinuteDuration, SecondDuration};
use chrono::{DateTime, Utc};
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub type CodeBuildPhaseStatus = String;
pub type CodeBuildPhaseType = String;
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildEvent {
#[serde(default)]
#[serde(rename = "account")]
pub account_id: Option<String>,
#[serde(default)]
pub region: Option<String>,
#[serde(default)]
#[serde(rename = "detail-type")]
pub detail_type: Option<String>,
#[serde(default)]
pub source: Option<String>,
#[serde(default)]
pub version: Option<String>,
pub time: DateTime<Utc>,
#[serde(default)]
pub id: Option<String>,
pub resources: Vec<String>,
pub detail: CodeBuildEventDetail,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildEventDetail {
#[serde(rename = "build-status")]
pub build_status: Option<CodeBuildPhaseStatus>,
#[serde(default)]
#[serde(rename = "project-name")]
pub project_name: Option<String>,
#[serde(default)]
#[serde(rename = "build-id")]
pub build_id: Option<String>,
#[serde(rename = "additional-information")]
pub additional_information: CodeBuildEventAdditionalInformation,
#[serde(rename = "current-phase")]
pub current_phase: Option<CodeBuildPhaseType>,
#[serde(default)]
#[serde(rename = "current-phase-context")]
pub current_phase_context: Option<String>,
#[serde(default)]
pub version: Option<String>,
#[serde(rename = "completed-phase-status")]
pub completed_phase_status: Option<CodeBuildPhaseStatus>,
#[serde(rename = "completed-phase")]
pub completed_phase: Option<CodeBuildPhaseType>,
#[serde(default)]
#[serde(rename = "completed-phase-context")]
pub completed_phase_context: Option<String>,
#[serde(rename = "completed-phase-duration-seconds")]
pub completed_phase_duration: Option<SecondDuration>,
#[serde(rename = "completed-phase-start")]
#[serde(default)]
#[serde(with = "codebuild_time::optional_time")]
pub completed_phase_start: Option<CodeBuildTime>,
#[serde(rename = "completed-phase-end")]
#[serde(default)]
#[serde(with = "codebuild_time::optional_time")]
pub completed_phase_end: Option<CodeBuildTime>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildEventAdditionalInformation {
pub artifact: CodeBuildArtifact,
pub environment: CodeBuildEnvironment,
#[serde(rename = "timeout-in-minutes")]
pub timeout: MinuteDuration,
#[serde(rename = "build-complete")]
pub build_complete: bool,
#[serde(rename = "build-number")]
pub build_number: Option<CodeBuildNumber>,
#[serde(default)]
pub initiator: Option<String>,
#[serde(rename = "build-start-time")]
#[serde(with = "codebuild_time::str_time")]
pub build_start_time: CodeBuildTime,
pub source: CodeBuildSource,
#[serde(default)]
#[serde(rename = "source-version")]
pub source_version: Option<String>,
pub logs: CodeBuildLogs,
pub phases: Vec<CodeBuildPhase>,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildArtifact {
#[serde(default)]
#[serde(rename = "md5sum")]
pub md5_sum: Option<String>,
#[serde(default)]
#[serde(rename = "sha256sum")]
pub sha256_sum: Option<String>,
#[serde(default)]
pub location: Option<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildEnvironment {
#[serde(default)]
pub image: Option<String>,
#[serde(rename = "privileged-mode")]
pub privileged_mode: bool,
#[serde(default)]
#[serde(rename = "compute-type")]
pub compute_type: Option<String>,
#[serde(default)]
pub type_: Option<String>,
#[serde(rename = "environment-variables")]
pub environment_variables: Vec<CodeBuildEnvironmentVariable>,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildEnvironmentVariable {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub type_: Option<String>,
#[serde(default)]
pub value: Option<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildSource {
#[serde(default)]
pub location: Option<String>,
#[serde(default)]
pub type_: Option<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildLogs {
#[serde(default)]
#[serde(rename = "group-name")]
pub group_name: Option<String>,
#[serde(default)]
#[serde(rename = "stream-name")]
pub stream_name: Option<String>,
#[serde(default)]
#[serde(rename = "deep-link")]
pub deep_link: Option<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CodeBuildPhase<T1 = Value>
where
T1: DeserializeOwned,
T1: Serialize,
{
#[serde(bound = "")]
#[serde(rename = "phase-context")]
pub phase_context: Option<Vec<T1>>,
#[serde(rename = "start-time")]
#[serde(with = "codebuild_time::str_time")]
pub start_time: CodeBuildTime,
#[serde(rename = "end-time")]
#[serde(default)]
#[serde(with = "codebuild_time::optional_time")]
pub end_time: Option<CodeBuildTime>,
#[serde(rename = "duration-in-seconds")]
pub duration: Option<SecondDuration>,
#[serde(rename = "phase-type")]
pub phase_type: CodeBuildPhaseType,
#[serde(rename = "phase-status")]
pub phase_status: Option<CodeBuildPhaseStatus>,
}
pub type CodeBuildTime = DateTime<Utc>;
#[cfg(test)]
mod test {
use super::*;
use serde_json;
#[test]
#[cfg(feature = "codebuild")]
fn example_codebuild_phase_change() {
let data = include_bytes!("../../fixtures/example-codebuild-phase-change.json");
let parsed: CodeBuildEvent = serde_json::from_slice(data).unwrap();
let output: String = serde_json::to_string(&parsed).unwrap();
let reparsed: CodeBuildEvent = serde_json::from_slice(output.as_bytes()).unwrap();
assert_eq!(parsed, reparsed);
}
#[test]
#[cfg(feature = "codebuild")]
fn example_codebuild_state_change() {
let data = include_bytes!("../../fixtures/example-codebuild-state-change.json");
let parsed: CodeBuildEvent = serde_json::from_slice(data).unwrap();
let output: String = serde_json::to_string(&parsed).unwrap();
let reparsed: CodeBuildEvent = serde_json::from_slice(output.as_bytes()).unwrap();
assert_eq!(parsed, reparsed);
}
}