use crate::extension::Extensions;
use serde::{Deserialize, Serialize};
use serde_json::{Number, Value};
use std::collections::BTreeMap;
#[derive(Deserialize, Serialize, Debug, PartialEq, Clone)]
pub struct Swagger {
pub swagger: String,
pub info: Info,
#[serde(skip_serializing_if = "Option::is_none")]
pub host: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "basePath")]
pub base_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schemas: Option<Vec<TransferProtocol>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub consumes: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub produces: Option<String>,
pub paths: BTreeMap<String, PathItem>,
#[serde(skip_serializing_if = "Option::is_none")]
pub definitions: Option<BTreeMap<String, Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<BTreeMap<String, Parameter>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub responses: Option<BTreeMap<String, Response>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "SecurityScheme")]
pub security_definitions: Option<BTreeMap<String, SecurityScheme>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub security: Option<Vec<SecurityRequirementObject>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<Tag>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
pub external_docs: Option<ExternalDoc>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct Info {
pub title: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "termsOfService", skip_serializing_if = "Option::is_none")]
pub terms_of_service: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contact: Option<Contact>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<License>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct Contact {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct License {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum TransferProtocol {
#[default]
Http,
Https,
Ws,
Wss,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct ExternalDoc {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub url: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct Tag {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "externalDoc")]
pub external_doc: Option<ExternalDoc>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum InEnum {
Query,
Header,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Flow {
Implicit,
Password,
Application,
AccessCode,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Scopes {
Implicit,
Password,
Application,
AccessCode,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum AuthorizationUrl {
Implicit,
AccessCode,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum SecuritySchemeType {
Basic,
ApiKey,
Oauth2,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum TokenUrl {
Password,
Application,
AccessCode,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct SecurityScheme {
pub r#type: SecuritySchemeType,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub name: String,
pub r#in: InEnum,
pub flow: Flow,
#[serde(rename = "authorizationUrl")]
pub authorization_url: AuthorizationUrl,
#[serde(rename = "tokenUrl")]
pub token_url: TokenUrl,
pub scopes: BTreeMap<String, String>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct SecurityRequirementObject(BTreeMap<String, Vec<String>>);
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct PathItem {
#[serde(rename = "$ref", skip_serializing_if = "Option::is_none")]
pub reference: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub get: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub put: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub delete: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub head: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub patch: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Vec<ParameterOrRef>>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Operation {
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
pub external_docs: Option<ExternalDoc>,
#[serde(skip_serializing_if = "Option::is_none", rename = "operationId")]
pub operation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub consumes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub produces: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Vec<ParameterOrRef>>,
pub responses: Responses,
#[serde(skip_serializing_if = "Option::is_none")]
pub schemas: Option<TransferProtocol>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deprecated: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub security: Option<Vec<SecurityRequirementObject>>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum ParameInEnum {
Query,
Header,
Path,
FormData,
Body,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(untagged)]
pub enum ParameterOrRef {
Ref(Refrence),
Parameter(Parameter),
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Refrence {
#[serde(rename = "$ref")]
reference: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Parameter {
pub name: String,
pub r#in: ParameInEnum,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schema: Option<Schema>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<ParameterType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "allowEmptyValue")]
pub allow_empty_value: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Items>,
#[serde(skip_serializing_if = "Option::is_none", rename = "collectionFormat")]
pub collection_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
pub exclusive_maximum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minimum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
pub exclusive_minimum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
pub max_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
pub min_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
pub max_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
pub min_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
pub unique_items: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#enum: Option<Vec<Value>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
pub multiple_of: Option<Number>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct Schema {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "$ref")]
pub reference: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "type")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "enum")]
pub r#enum: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
pub exclusive_maximum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minimum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
pub exclusive_minimum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
pub max_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
pub min_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
pub max_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
pub min_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
pub unique_items: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
pub multiple_of: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Box<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<BTreeMap<String, Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "allOf")]
pub all_of: Option<Vec<Box<Schema>>>,
#[serde(flatten)]
pub extensions: BTreeMap<String, serde_json::Value>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ParameterType {
String,
Number,
Integer,
Boolean,
Array,
File,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ItemsType {
String,
Number,
Integer,
Boolean,
Array,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Items {
pub r#type: ItemsType,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Box<Items>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "collectionFormat")]
pub collection_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
pub exclusive_maximum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minimum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
pub exclusive_minimum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
pub max_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
pub min_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
pub max_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
pub min_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
pub unique_items: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#enum: Option<Vec<Value>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
pub multiple_of: Option<Number>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Responses(BTreeMap<String, ResponseOrRef>);
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Response {
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub schema: Option<Schema>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<BTreeMap<String, Header>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub examples: Option<BTreeMap<String, Value>>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Header {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub r#type: ItemsType,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Box<Items>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "collectionFormat")]
pub collection_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
pub exclusive_maximum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minimum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
pub exclusive_minimum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
pub max_length: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
pub min_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
pub max_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
pub min_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
pub unique_items: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#enum: Option<Vec<Value>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
pub multiple_of: Option<Number>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(untagged)]
pub enum ResponseOrRef {
Response {
description: String,
schema: Option<Schema>,
headers: Option<BTreeMap<String, Header>>,
examples: Option<BTreeMap<String, Value>>,
#[serde(flatten)]
extensions: Extensions,
},
Ref {
#[serde(rename = "$ref")]
reference: String,
},
}
#[cfg(test)]
mod test {
use super::*;
use serde_json;
#[test]
fn parameter_or_ref_dese() {
let json_str = r#"{
"$ref":"/some/path"
}"#;
assert_eq!(
serde_json::from_str::<ParameterOrRef>(&json_str).unwrap(),
ParameterOrRef::Ref(Refrence {
reference: "/some/path".to_string()
})
)
}
}