1
0
Fork 0
forgejo-api/generator/src/openapi.rs
2024-01-10 22:48:59 -05:00

349 lines
9.6 KiB
Rust

use std::collections::BTreeMap;
use url::Url;
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct OpenApiV2 {
pub swagger: String,
pub info: SpecInfo,
pub host: Option<Url>,
pub base_path: Option<String>,
pub schemes: Option<Vec<String>>,
pub consumes: Option<Vec<String>>,
pub produces: Option<Vec<String>>,
pub paths: BTreeMap<String, PathItem>,
pub definitions: Option<BTreeMap<String, Schema>>,
pub parameters: Option<BTreeMap<String, Parameter>>,
pub responses: Option<BTreeMap<String, Response>>,
pub security_definitions: Option<BTreeMap<String, SecurityScheme>>,
pub security: Option<Vec<BTreeMap<String, Vec<String>>>>,
pub tags: Option<Vec<Tag>>,
pub external_docs: Option<ExternalDocs>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct SpecInfo {
pub title: String,
pub description: Option<String>,
pub terms_of_service: Option<String>,
pub contact: Option<Contact>,
pub license: Option<License>,
pub version: String,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Contact {
pub name: Option<String>,
pub url: Option<String>,
pub email: Option<String>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct License {
pub name: String,
pub url: Option<Url>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct PathItem {
#[serde(rename = "$ref")]
pub _ref: Option<String>,
pub get: Option<Operation>,
pub put: Option<Operation>,
pub post: Option<Operation>,
pub delete: Option<Operation>,
pub options: Option<Operation>,
pub head: Option<Operation>,
pub patch: Option<Operation>,
pub parameters: Option<Vec<MaybeRef<Parameter>>>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Operation {
pub tags: Option<Vec<String>>,
pub summary: Option<String>,
pub description: Option<String>,
pub external_docs: Option<ExternalDocs>,
pub operation_id: Option<String>,
pub consumes: Option<Vec<String>>,
pub produces: Option<Vec<String>>,
pub parameters: Option<Vec<MaybeRef<Parameter>>>,
pub responses: Responses,
pub schemes: Option<Vec<String>>,
pub deprecated: Option<bool>,
pub security: Option<Vec<BTreeMap<String, Vec<String>>>>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct ExternalDocs {
pub description: Option<String>,
pub url: Url,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Parameter {
pub name: String,
#[serde(rename = "in")]
pub _in: ParameterIn,
pub description: Option<String>,
pub required: Option<bool>,
pub schema: Option<MaybeRef<Schema>>,
#[serde(rename = "type")]
pub _type: Option<ParameterType>,
pub format: Option<String>,
pub allow_empty_value: Option<bool>,
pub items: Option<Items>,
pub collection_format: Option<CollectionFormat>,
pub default: Option<serde_json::Value>,
pub maximum: Option<f64>,
pub exclusive_maximum: Option<bool>,
pub minimum: Option<f64>,
pub exclusive_minimum: Option<bool>,
pub max_length: Option<u64>,
pub min_length: Option<u64>,
pub pattern: Option<String>, // should be regex
pub max_items: Option<u64>,
pub min_items: Option<u64>,
pub unique_items: Option<bool>,
#[serde(rename = "enum")]
pub _enum: Option<Vec<serde_json::Value>>,
pub multiple_of: Option<u64>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub enum ParameterIn {
Path,
Query,
Header,
Body,
FormData,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub enum ParameterType {
String,
Number,
Integer,
Boolean,
Array,
File,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub enum CollectionFormat {
Csv,
Ssv,
Tsv,
Pipes,
Multi,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Items {
#[serde(rename = "type")]
pub _type: ParameterType,
pub format: Option<String>,
pub items: Option<Box<Items>>,
pub collection_format: Option<CollectionFormat>,
pub default: Option<serde_json::Value>,
pub maximum: Option<f64>,
pub exclusive_maximum: Option<bool>,
pub minimum: Option<f64>,
pub exclusive_minimum: Option<bool>,
pub max_length: Option<u64>,
pub min_length: Option<u64>,
pub pattern: Option<String>, // should be regex
pub max_items: Option<u64>,
pub min_items: Option<u64>,
pub unique_items: Option<bool>,
#[serde(rename = "enum")]
pub _enum: Option<Vec<serde_json::Value>>,
pub multiple_of: Option<u64>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Responses {
pub default: Option<MaybeRef<Response>>,
#[serde(flatten)]
pub http_codes: BTreeMap<String, MaybeRef<Response>>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Response {
pub description: String,
pub schema: Option<Schema>,
pub headers: Option<BTreeMap<String, Header>>,
pub examples: Option<BTreeMap<String, serde_json::Value>>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Header {
pub description: Option<String>,
#[serde(rename = "type")]
pub _type: ParameterType,
pub format: Option<String>,
pub items: Option<Items>,
pub collection_format: Option<CollectionFormat>,
pub default: Option<serde_json::Value>,
pub maximum: Option<f64>,
pub exclusive_maximum: Option<bool>,
pub minimum: Option<f64>,
pub exclusive_minimum: Option<bool>,
pub max_length: Option<u64>,
pub min_length: Option<u64>,
pub pattern: Option<String>, // should be regex
pub max_items: Option<u64>,
pub min_items: Option<u64>,
pub unique_items: Option<bool>,
#[serde(rename = "enum")]
pub _enum: Option<Vec<serde_json::Value>>,
pub multiple_of: Option<u64>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Tag {
pub name: String,
pub description: Option<String>,
pub external_docs: Option<ExternalDocs>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Schema {
pub format: Option<String>,
pub title: Option<String>,
pub description: Option<String>,
pub default: Option<serde_json::Value>,
pub multiple_of: Option<u64>,
pub maximum: Option<f64>,
pub exclusive_maximum: Option<bool>,
pub minimum: Option<f64>,
pub exclusive_minimum: Option<bool>,
pub max_length: Option<u64>,
pub min_length: Option<u64>,
pub pattern: Option<String>, // should be regex
pub max_items: Option<u64>,
pub min_items: Option<u64>,
pub unique_items: Option<bool>,
pub max_properties: Option<u64>,
pub min_properties: Option<u64>,
pub required: Option<Vec<String>>,
#[serde(rename = "enum")]
pub _enum: Option<Vec<serde_json::Value>>,
#[serde(rename = "type")]
pub _type: Option<SchemaType>,
pub discriminator: Option<String>,
pub read_only: Option<bool>,
pub xml: Option<Xml>,
pub external_docs: Option<ExternalDocs>,
pub example: Option<serde_json::Value>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(untagged)]
pub enum SchemaType {
One(Primitive),
List(Vec<Primitive>),
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub enum Primitive {
Array,
Boolean,
Integer,
Number,
Null,
Object,
String,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct Xml {
pub name: Option<String>,
pub namespace: Option<Url>,
pub prefix: Option<String>,
pub attribute: Option<bool>,
pub wrapped: Option<bool>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct SecurityScheme {
#[serde(flatten)]
pub _type: SecurityType,
pub description: Option<String>,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"), tag = "type")]
pub enum SecurityType {
Basic,
ApiKey {
name: String,
#[serde(rename = "in")]
_in: KeyIn,
},
OAuth2 {
#[serde(flatten)]
flow: OAuth2Flow,
scopes: BTreeMap<String, String>,
},
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"))]
pub enum KeyIn {
Query,
Header,
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(rename_all(deserialize = "camelCase"), tag = "flow")]
pub enum OAuth2Flow {
Implicit {
authorization_url: Url,
},
Password {
token_url: Url,
},
Application {
token_url: Url,
},
AccessCode {
authorization_url: Url,
token_url: Url,
},
}
#[derive(serde::Deserialize, Debug, PartialEq)]
#[serde(untagged)]
pub enum MaybeRef<T> {
Value {
#[serde(flatten)]
value: T,
},
Ref {
#[serde(rename = "$ref")]
_ref: String,
},
}