use serde::Deserialize;
use std::collections::HashMap;
use std::fs::File;
use std::path::Path;
#[derive(Deserialize)]
pub struct OpenApi {
pub components: Components,
}
#[derive(Deserialize)]
pub struct Components {
pub schemas: HashMap<String, Schema>,
}
#[derive(Deserialize)]
#[serde(untagged)]
pub enum Schema {
Ref {
#[serde(rename = "$ref")]
ref_: String,
},
Typed {
#[serde(rename = "type", default)]
schema_type: String,
#[serde(default)]
format: String,
#[serde(default)]
nullable: bool,
#[serde(default)]
description: String,
properties: Option<HashMap<String, Schema>>,
#[serde(default)]
required: Vec<String>,
items: Option<Box<Schema>>,
#[serde(rename = "enum")]
enum_items: Option<Vec<String>>,
#[serde(rename = "allOf")]
all_of: Option<Vec<Schema>>,
#[serde(rename = "oneOf")]
one_of: Option<Vec<Schema>>,
#[serde(rename = "anyOf")]
any_of: Option<Vec<Schema>>,
},
}
impl OpenApi {
pub fn from_str(data: &str) -> Self {
if data.trim_start().starts_with("{") {
serde_json::from_str(data).unwrap()
} else {
serde_yaml::from_str(data).unwrap()
}
}
pub fn from_file<P: AsRef<Path>>(path: P) -> Self {
let path_ref = path.as_ref();
if path_ref.extension().unwrap() == "json" {
serde_json::from_reader(File::open(path_ref).unwrap()).unwrap()
} else if path_ref.extension().unwrap() == "yaml" {
serde_yaml::from_reader(File::open(path_ref).unwrap()).unwrap()
} else {
panic!("Couldn't determine the schema file format");
}
}
}