use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
use serde_with::serde_as;
use std::collections::HashMap;
use std::sync::Arc;
use crate::ApicizeError;
use super::{ApicizeBody, ApicizeTestBehavior, oauth2_client_tokens::TokenResult};
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeExecution {
pub name: String,
pub key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
pub test_context: ApicizeExecutionTestContext,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_variables: Option<Arc<Map<String, Value>>>,
pub logs: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tests: Option<Vec<ApicizeTestBehavior>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub curl: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ApicizeError>,
pub success: bool,
pub test_pass_count: usize,
pub test_fail_count: usize,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeExecutionTestContext {
#[serde(skip_serializing_if = "Option::is_none", rename = "$")]
pub merged: Option<Arc<Map<String, Value>>>,
#[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 request: Option<ApicizeHttpRequest>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<ApicizeHttpResponse>,
}
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeHttpRequest {
pub url: String,
pub method: String,
pub headers: HashMap<String, String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<ApicizeBody>,
}
#[serde_as]
#[derive(Serialize, Deserialize, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ApicizeHttpResponse {
pub status: u16,
pub status_text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<ApicizeBody>,
pub oauth2_token: Option<TokenResult>,
}