use super::{Content, Required};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[non_exhaustive]
#[derive(Serialize, Deserialize, Default, Clone, PartialEq)]
#[cfg_attr(feature = "debug", derive(Debug))]
#[serde(rename_all = "camelCase")]
pub struct RequestBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub content: BTreeMap<String, Content>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<Required>,
}
impl RequestBody {
pub fn new() -> Self {
Default::default()
}
pub fn description<S: Into<String>>(mut self, description: S) -> Self {
self.description = Some(description.into());
self
}
pub fn required(mut self, required: Required) -> Self {
self.required = Some(required);
self
}
pub fn add_content<S: Into<String>, C: Into<Content>>(mut self, kind: S, content: C) -> Self {
self.content.insert(kind.into(), content.into());
self
}
pub fn merge(&mut self, other: RequestBody) {
let RequestBody {
description,
content,
required,
} = other;
if let Some(description) = description {
if !description.is_empty() {
self.description = Some(description);
}
}
self.content.extend(content);
if let Some(required) = required {
self.required = Some(required);
}
}
}
#[cfg(test)]
mod tests {
use super::{Content, RequestBody, Required};
use assert_json_diff::assert_json_eq;
use serde_json::json;
#[test]
fn request_body_new() {
let request_body = RequestBody::new();
assert!(request_body.content.is_empty());
assert_eq!(request_body.description, None);
assert!(request_body.required.is_none());
}
#[test]
fn request_body_builder() -> Result<(), serde_json::Error> {
let request_body = RequestBody::new()
.description("A sample requestBody")
.required(Required::True)
.add_content(
"application/json",
Content::new(crate::Ref::from_schema_name("EmailPayload")),
);
assert_json_eq!(
request_body,
json!({
"description": "A sample requestBody",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EmailPayload"
}
}
},
"required": true
})
);
Ok(())
}
#[test]
fn request_body_merge() {
let mut request_body = RequestBody::new();
let other_request_body = RequestBody::new()
.description("Merged requestBody")
.required(Required::True)
.add_content(
"application/json",
Content::new(crate::Ref::from_schema_name("EmailPayload")),
);
request_body.merge(other_request_body);
assert_json_eq!(
request_body,
json!({
"description": "Merged requestBody",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EmailPayload"
}
}
},
"required": true
})
);
}
}