use std::collections::HashMap;
use crate::{Identifiable, identifiable::CloneIdentifiable};
use super::{ApicizeExecution, DataContext};
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use serde_with::base64::{Base64, Standard};
use serde_with::formats::Unpadded;
use serde_with::serde_as;
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(tag = "type")]
pub enum ApicizeResult {
Request(Box<ApicizeRequestResult>),
Group(Box<ApicizeGroupResult>),
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(tag = "type")]
pub enum ApicizeRequestResultContent {
Rows {
rows: Vec<ApicizeRequestResultRow>,
},
Runs {
runs: Vec<ApicizeRequestResultRun>,
},
Execution {
execution: Box<ApicizeExecution>,
},
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeRequestResult {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
pub executed_at: u128,
pub duration: u128,
pub data_context: DataContext,
pub content: ApicizeRequestResultContent,
pub logs: Option<Vec<String>>,
pub success: bool,
pub request_success_count: usize,
pub request_failure_count: usize,
pub request_error_count: usize,
pub test_pass_count: usize,
pub test_fail_count: usize,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(tag = "type")]
pub enum ApicizeRequestResultRowContent {
Runs(Vec<ApicizeRequestResultRun>),
Execution(Box<ApicizeExecution>),
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeRequestResultRow {
pub row_number: usize,
pub executed_at: u128,
pub duration: u128,
pub data_context: DataContext,
pub results: ApicizeRequestResultRowContent,
pub success: bool,
pub request_success_count: usize,
pub request_failure_count: usize,
pub request_error_count: usize,
pub test_pass_count: usize,
pub test_fail_count: usize,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeRequestResultRun {
pub run_number: usize,
pub executed_at: u128,
pub duration: u128,
pub execution: ApicizeExecution,
pub success: bool,
pub request_success_count: usize,
pub request_failure_count: usize,
pub request_error_count: usize,
pub test_pass_count: usize,
pub test_fail_count: usize,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(tag = "type")]
pub enum ApicizeGroupResultContent {
Rows { rows: Vec<ApicizeGroupResultRow> },
Runs { runs: Vec<ApicizeGroupResultRun> },
Results { results: Vec<ApicizeResult> },
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeGroupResult {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
pub executed_at: u128,
pub duration: u128,
pub data_context: DataContext,
pub content: ApicizeGroupResultContent,
pub logs: Option<Vec<String>>,
pub success: bool,
pub request_success_count: usize,
pub request_failure_count: usize,
pub request_error_count: usize,
pub test_pass_count: usize,
pub test_fail_count: usize,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(tag = "type")]
pub enum ApicizeGroupResultRowContent {
Runs { runs: Vec<ApicizeGroupResultRun> },
Results { results: Vec<ApicizeResult> },
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeGroupResultRow {
pub row_number: usize,
pub executed_at: u128,
pub duration: u128,
pub data_context: DataContext,
pub content: ApicizeGroupResultRowContent,
pub success: bool,
pub request_success_count: usize,
pub request_failure_count: usize,
pub request_error_count: usize,
pub test_pass_count: usize,
pub test_fail_count: usize,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeGroupResultRun {
pub run_number: usize,
pub executed_at: u128,
pub duration: u128,
pub data_context: DataContext,
pub results: Vec<ApicizeResult>,
pub success: bool,
pub request_success_count: usize,
pub request_failure_count: usize,
pub request_error_count: usize,
pub test_pass_count: usize,
pub test_fail_count: usize,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
pub struct ApicizeList<T> {
pub items: Vec<T>,
}
#[serde_as]
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(tag = "type")]
pub enum ApicizeBody {
Text {
text: String,
},
JSON {
text: String,
data: Value,
},
XML {
text: String,
data: Value,
},
Form {
text: String,
data: HashMap<String, String>,
},
Binary {
#[serde_as(as = "Base64<Standard, Unpadded>")]
data: Vec<u8>,
},
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeTestResponse {
pub results: Option<Vec<ApicizeTestResult>>,
pub output: Map<String, Value>,
pub logs: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(tag = "type")]
pub enum ApicizeTestResult {
Scenario(ApicizeTestScenario),
Behavior(ApicizeTestBehavior),
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeTestScenario {
pub name: String,
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub children: Option<Vec<ApicizeTestResult>>,
pub test_count: usize,
pub test_fail_count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub logs: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeTestBehavior {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logs: Option<Vec<String>>,
}
impl Identifiable for ApicizeResult {
fn get_id(&self) -> &str {
match self {
ApicizeResult::Request(request) => request.get_id(),
ApicizeResult::Group(group) => group.get_id(),
}
}
fn get_name(&self) -> &str {
match self {
ApicizeResult::Request(request) => request.get_name(),
ApicizeResult::Group(group) => group.get_name(),
}
}
fn get_title(&self) -> String {
match self {
ApicizeResult::Request(request) => request.get_title(),
ApicizeResult::Group(group) => group.get_title(),
}
}
}
impl CloneIdentifiable for ApicizeResult {
fn clone_as_new(&self, new_name: String) -> Self {
match self {
ApicizeResult::Request(request) => {
ApicizeResult::Request(Box::new(request.clone_as_new(new_name)))
}
ApicizeResult::Group(group) => {
ApicizeResult::Group(Box::new(group.clone_as_new(new_name)))
}
}
}
}
impl Identifiable for ApicizeRequestResult {
fn get_id(&self) -> &str {
&self.id
}
fn get_name(&self) -> &str {
&self.name
}
fn get_title(&self) -> String {
if self.name.is_empty() {
"Unnamed".to_string()
} else {
self.name.clone()
}
}
}
impl CloneIdentifiable for ApicizeRequestResult {
fn clone_as_new(&self, new_name: String) -> Self {
let mut cloned = self.clone();
cloned.name = new_name;
cloned
}
}
impl Identifiable for ApicizeGroupResult {
fn get_id(&self) -> &str {
&self.id
}
fn get_name(&self) -> &str {
&self.name
}
fn get_title(&self) -> String {
if self.name.is_empty() {
"Unnamed".to_string()
} else {
self.name.clone()
}
}
}
impl CloneIdentifiable for ApicizeGroupResult {
fn clone_as_new(&self, new_name: String) -> Self {
let mut cloned = self.clone();
cloned.name = new_name;
cloned
}
}