use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use super::{Content, Required};
#[non_exhaustive]
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct RequestBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "content")]
pub contents: IndexMap<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.contents.insert(kind.into(), content.into());
self
}
pub fn merge(&mut self, other: RequestBody) {
let RequestBody {
description,
contents,
required,
} = other;
if let Some(description) = description {
if !description.is_empty() {
self.description = Some(description);
}
}
self.contents.extend(contents);
if let Some(required) = required {
self.required = Some(required);
}
}
}
#[cfg(test)]
mod tests {
use assert_json_diff::assert_json_eq;
use serde_json::json;
use super::{Content, RequestBody, Required};
#[test]
fn request_body_new() {
let request_body = RequestBody::new();
assert!(request_body.contents.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")),
);
let serialized = serde_json::to_string_pretty(&request_body)?;
println!("serialized json:\n {serialized}");
assert_json_eq!(
request_body,
json!({
"description": "A sample requestBody",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EmailPayload"
}
}
},
"required": true
})
);
Ok(())
}
}