use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct CachedSpec {
pub cache_format_version: u32,
pub name: String,
pub version: String,
pub commands: Vec<CachedCommand>,
pub base_url: Option<String>,
pub servers: Vec<String>,
pub security_schemes: HashMap<String, CachedSecurityScheme>,
#[serde(default)]
pub skipped_endpoints: Vec<SkippedEndpoint>,
#[serde(default)]
pub server_variables: HashMap<String, ServerVariable>,
}
impl CachedSpec {
#[cfg(test)]
#[must_use]
pub fn new_for_test(name: &str) -> Self {
Self {
cache_format_version: CACHE_FORMAT_VERSION,
name: name.to_string(),
version: "1.0.0".to_string(),
commands: vec![],
base_url: None,
servers: vec![],
security_schemes: HashMap::new(),
skipped_endpoints: vec![],
server_variables: HashMap::new(),
}
}
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Default)]
#[serde(rename_all = "kebab-case")]
pub enum PaginationStrategy {
#[default]
None,
Cursor,
Offset,
LinkHeader,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Default)]
pub struct PaginationInfo {
pub strategy: PaginationStrategy,
pub cursor_field: Option<String>,
pub cursor_param: Option<String>,
pub page_param: Option<String>,
pub limit_param: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct CommandExample {
pub description: String,
pub command_line: String,
pub explanation: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct SkippedEndpoint {
pub path: String,
pub method: String,
pub content_type: String,
pub reason: String,
}
pub const CACHE_FORMAT_VERSION: u32 = 6;
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
pub struct GlobalCacheMetadata {
pub cache_format_version: u32,
pub specs: std::collections::HashMap<String, SpecMetadata>,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
pub struct SpecMetadata {
pub updated_at: String, pub file_size: u64,
#[serde(default)]
pub content_hash: Option<String>,
#[serde(default)]
pub mtime_secs: Option<u64>,
#[serde(default)]
pub spec_file_size: Option<u64>,
}
impl Default for GlobalCacheMetadata {
fn default() -> Self {
Self {
cache_format_version: CACHE_FORMAT_VERSION,
specs: std::collections::HashMap::new(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct CachedCommand {
pub name: String,
pub description: Option<String>,
pub summary: Option<String>,
pub operation_id: String,
pub method: String,
pub path: String,
pub parameters: Vec<CachedParameter>,
pub request_body: Option<CachedRequestBody>,
pub responses: Vec<CachedResponse>,
pub security_requirements: Vec<String>,
pub tags: Vec<String>,
pub deprecated: bool,
pub external_docs_url: Option<String>,
#[serde(default)]
pub examples: Vec<CommandExample>,
#[serde(default)]
pub display_group: Option<String>,
#[serde(default)]
pub display_name: Option<String>,
#[serde(default)]
pub aliases: Vec<String>,
#[serde(default)]
pub hidden: bool,
#[serde(default)]
pub pagination: PaginationInfo,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct CachedParameter {
pub name: String,
pub location: String,
pub required: bool,
pub description: Option<String>,
pub schema: Option<String>,
pub schema_type: Option<String>,
pub format: Option<String>,
pub default_value: Option<String>,
pub enum_values: Vec<String>,
pub example: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct CachedRequestBody {
pub content_type: String,
pub schema: String,
pub required: bool,
pub description: Option<String>,
pub example: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct CachedResponse {
pub status_code: String,
pub description: Option<String>,
pub content_type: Option<String>,
pub schema: Option<String>,
#[serde(default)]
pub example: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct CachedSecurityScheme {
pub name: String,
pub scheme_type: String,
pub scheme: Option<String>,
pub location: Option<String>,
pub parameter_name: Option<String>,
pub description: Option<String>,
pub bearer_format: Option<String>,
pub aperture_secret: Option<CachedApertureSecret>,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq, Clone)]
pub struct CachedApertureSecret {
pub source: String,
pub name: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct ServerVariable {
pub default: Option<String>,
pub enum_values: Vec<String>,
pub description: Option<String>,
}