use crate::{
ApicizeExecution, ApicizeGroupResultRow, ApicizeGroupResultRun, ApicizeRequestResultRow,
ApicizeRequestResultRun, ApicizeResult,
};
use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use std::sync::Arc;
#[derive(Serialize, Deserialize, PartialEq, Clone, Default)]
#[serde(rename_all = "camelCase")]
pub struct DataContext {
#[serde(skip_serializing_if = "Option::is_none")]
pub scenario: Option<Arc<Map<String, Value>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output: Option<Arc<Map<String, Value>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Arc<Map<String, Value>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_result: Option<Arc<Map<String, Value>>>,
}
pub trait GetDataContext {
fn get_data_context(&self) -> &DataContext;
}
impl GetDataContext for ApicizeResult {
fn get_data_context(&self) -> &DataContext {
match self {
ApicizeResult::Request(request) => &request.data_context,
ApicizeResult::Group(group) => &group.data_context,
}
}
}
pub trait DataContextGenerator {
fn generate_data_context(&self) -> DataContext;
}
impl DataContextGenerator for Vec<ApicizeGroupResultRow> {
fn generate_data_context(&self) -> DataContext {
if let Some(first) = self.first() {
let last = self.last().unwrap();
DataContext {
scenario: first.data_context.scenario.clone(),
output: first.data_context.output.clone(),
data: first.data_context.data.clone(),
output_result: last.data_context.output_result.clone(),
}
} else {
DataContext::default()
}
}
}
impl DataContextGenerator for Vec<ApicizeGroupResultRun> {
fn generate_data_context(&self) -> DataContext {
if let Some(first) = self.first() {
let last = self.last().unwrap();
DataContext {
scenario: first.data_context.scenario.clone(),
output: first.data_context.output.clone(),
data: first.data_context.data.clone(),
output_result: last.data_context.output_result.clone(),
}
} else {
DataContext::default()
}
}
}
impl DataContextGenerator for Vec<ApicizeRequestResultRow> {
fn generate_data_context(&self) -> DataContext {
if let Some(first) = self.first() {
let last = self.last().unwrap();
DataContext {
scenario: first.data_context.scenario.clone(),
output: first.data_context.output.clone(),
data: first.data_context.data.clone(),
output_result: last.data_context.output_result.clone(),
}
} else {
DataContext::default()
}
}
}
impl DataContextGenerator for Vec<ApicizeRequestResultRun> {
fn generate_data_context(&self) -> DataContext {
if let Some(first) = self.first() {
let first_execution = &first.execution;
let last_execution = &self.last().unwrap().execution;
DataContext {
scenario: first_execution.test_context.scenario.clone(),
data: first_execution.test_context.data.clone(),
output: first_execution.test_context.output.clone(),
output_result: last_execution.output_variables.clone(),
}
} else {
DataContext::default()
}
}
}
impl DataContextGenerator for Vec<ApicizeResult> {
fn generate_data_context(&self) -> DataContext {
if let Some(first) = self.first() {
let first_context = first.get_data_context();
let last_context = self.last().unwrap().get_data_context();
let mut data_context = first_context.clone();
data_context.output_result = last_context.output_result.clone();
data_context
} else {
DataContext::default()
}
}
}
impl DataContextGenerator for ApicizeExecution {
fn generate_data_context(&self) -> DataContext {
DataContext {
scenario: self.test_context.scenario.clone(),
output: self.test_context.output.clone(),
data: self.test_context.data.clone(),
output_result: self.output_variables.clone(),
}
}
}