From e6c5e958c13eb5ea9c39a0b1b586d7213ad23a51 Mon Sep 17 00:00:00 2001 From: Hanif Ariffin Date: Tue, 26 Jan 2021 18:15:16 +0800 Subject: [PATCH] Fixed the data structure for OpenApi 3 1. Enums can hold any value: boolean, strings, numbers...so just use JsonValue 2. Items can point to Ref so wrap Schema inside ObjectOrReference 3. Reorder ObjectOrReference because they are untagged, its better to check for Ref first Signed-off-by: Hanif Ariffin --- src/v3_0/components.rs | 16 ++++++++-------- src/v3_0/schema.rs | 7 ++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/v3_0/components.rs b/src/v3_0/components.rs index 45a93d3..f93e717 100644 --- a/src/v3_0/components.rs +++ b/src/v3_0/components.rs @@ -5,25 +5,25 @@ use crate::v3_0::{ use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; +#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] +pub struct Ref { + #[serde(rename = "$ref")] + pub ref_path: String, +} + #[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] #[serde(untagged)] pub enum ObjectOrReference { + Ref(Ref), Object(T), - Ref { - #[serde(rename = "$ref")] - ref_path: String, - }, } #[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] #[serde(untagged)] pub enum BooleanObjectOrReference { + Ref(Ref), Boolean(bool), Object(T), - Ref { - #[serde(rename = "$ref")] - ref_path: String, - }, } /// Holds a set of reusable objects for different aspects of the OAS. diff --git a/src/v3_0/schema.rs b/src/v3_0/schema.rs index ab8ba7d..849eafd 100644 --- a/src/v3_0/schema.rs +++ b/src/v3_0/schema.rs @@ -2,6 +2,7 @@ use crate::v3_0::extension::Extensions; use serde::{Deserialize, Serialize}; +use serde_yaml::Value; use std::collections::{BTreeMap, HashMap}; use url::Url; @@ -441,16 +442,16 @@ pub struct Schema { #[serde(skip_serializing_if = "Option::is_none")] #[serde(rename = "enum")] - pub enum_values: Option>, + pub enum_values: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub required: Option>, #[serde(skip_serializing_if = "Option::is_none")] - pub items: Option>, + pub items: Option>>, #[serde(skip_serializing_if = "Option::is_none")] - pub properties: Option>, + pub properties: Option>>, #[serde(skip_serializing_if = "Option::is_none", rename = "readOnly")] pub read_only: Option,