use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::{Deprecated, RefOr, Schema, SchemaType, Xml};
#[non_exhaustive]
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct Array {
#[serde(rename = "type")]
pub schema_type: SchemaType,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub items: Box<RefOr<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deprecated: Option<Deprecated>,
#[serde(skip_serializing_if = "Option::is_none")]
pub example: Option<Value>,
#[serde(rename = "default", skip_serializing_if = "Option::is_none")]
pub default_value: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_items: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_items: Option<usize>,
#[serde(default, skip_serializing_if = "super::is_false")]
pub unique_items: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub xml: Option<Xml>,
#[serde(default, skip_serializing_if = "super::is_false")]
pub nullable: bool,
}
impl Default for Array {
fn default() -> Self {
Self {
title: Default::default(),
schema_type: SchemaType::Array,
unique_items: bool::default(),
items: Default::default(),
description: Default::default(),
deprecated: Default::default(),
example: Default::default(),
default_value: Default::default(),
max_items: Default::default(),
min_items: Default::default(),
xml: Default::default(),
nullable: Default::default(),
}
}
}
impl Array {
pub fn new<I: Into<RefOr<Schema>>>(component: I) -> Self {
Self {
items: Box::new(component.into()),
..Default::default()
}
}
pub fn items<I: Into<RefOr<Schema>>>(mut self, component: I) -> Self {
self.items = Box::new(component.into());
self
}
pub fn title(mut self, title: impl Into<String>) -> Self {
self.title = Some(title.into());
self
}
pub fn description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
pub fn deprecated(mut self, deprecated: Deprecated) -> Self {
self.deprecated = Some(deprecated);
self
}
pub fn example(mut self, example: Value) -> Self {
self.example = Some(example);
self
}
pub fn default_value(mut self, default: Value) -> Self {
self.default_value = Some(default);
self
}
pub fn max_items(mut self, max_items: usize) -> Self {
self.max_items = Some(max_items);
self
}
pub fn min_items(mut self, min_items: usize) -> Self {
self.min_items = Some(min_items);
self
}
pub fn unique_items(mut self, unique_items: bool) -> Self {
self.unique_items = unique_items;
self
}
pub fn xml(mut self, xml: Xml) -> Self {
self.xml = Some(xml);
self
}
pub fn nullable(mut self, nullable: bool) -> Self {
self.nullable = nullable;
self
}
}
impl From<Array> for Schema {
fn from(array: Array) -> Self {
Self::Array(array)
}
}
impl From<Array> for RefOr<Schema> {
fn from(array: Array) -> Self {
Self::T(Schema::Array(array))
}
}
impl ToArray for Array {}
pub trait ToArray
where
RefOr<Schema>: From<Self>,
Self: Sized,
{
fn to_array(self) -> Array {
Array::new(self)
}
}
#[cfg(test)]
mod tests {
use assert_json_diff::assert_json_eq;
use serde_json::json;
use super::*;
use crate::Object;
#[test]
fn test_build_array() {
let array = Array::new(Object::with_type(SchemaType::Object))
.items(Object::with_type(SchemaType::String))
.title("title")
.description("description")
.deprecated(Deprecated::False)
.example(Value::String("example".to_string()))
.default_value(Value::String("default".to_string()))
.max_items(10)
.min_items(1)
.unique_items(true)
.xml(Xml::new())
.nullable(false);
assert_json_eq!(
array,
json!({
"type": "array",
"items": {
"type": "string"
},
"title": "title",
"description": "description",
"deprecated": false,
"example": "example",
"default": "default",
"maxItems": 10,
"minItems": 1,
"uniqueItems": true,
"xml": {},
})
)
}
#[test]
fn test_schema_from_array() {
let array = Array::default();
let schema = Schema::from(array);
assert_json_eq!(
schema,
json!({
"type": "array",
"items": {
"type": "object"
}
})
)
}
}