use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractSourceSpan {
pub path: Option<PathBuf>,
pub line: usize,
pub column: usize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ContractParameterShape {
Scalar,
Array,
Object,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractParameter {
pub name: String,
pub location: String,
pub required: bool,
pub style: String,
pub explode: bool,
pub allow_reserved: bool,
pub shape: ContractParameterShape,
pub value: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractTypeRef {
pub target: String,
pub array_depth: usize,
pub nullable: bool,
}
impl ContractTypeRef {
pub fn new(target: impl Into<String>) -> Self {
Self {
target: target.into(),
array_depth: 0,
nullable: false,
}
}
pub fn array(mut self) -> Self {
self.array_depth += 1;
self
}
pub fn nullable(mut self) -> Self {
self.nullable = true;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractScalarDefinition {
pub name: String,
pub expression: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractSchemaField {
pub name: String,
pub value_type: ContractTypeRef,
pub required: bool,
}
impl ContractSchemaField {
pub fn required(name: impl Into<String>, value_type: ContractTypeRef) -> Self {
Self {
name: name.into(),
value_type,
required: true,
}
}
pub fn optional(name: impl Into<String>, value_type: ContractTypeRef) -> Self {
Self {
name: name.into(),
value_type,
required: false,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractDiscriminatorBranch {
pub tag: String,
pub target: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ContractSchemaShape {
Object { fields: Vec<ContractSchemaField> },
Array(ContractTypeRef),
Alias(ContractTypeRef),
AllOf(Vec<String>),
OneOf(Vec<String>),
AnyOf(Vec<String>),
Not(String),
Discriminator {
field: String,
branches: Vec<ContractDiscriminatorBranch>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractSchemaDefinition {
pub name: String,
pub shape: ContractSchemaShape,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractRequestBody {
pub content_type: String,
pub example: Option<String>,
pub schema: Option<ContractResponseSchema>,
pub required: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ContractResponseSchema {
Scalar(String),
Type(ContractTypeRef),
Object { fields: Vec<ContractSchemaField> },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractResponseBody {
pub content_type: String,
pub schema: Option<ContractResponseSchema>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ContractSecuritySchemeKind {
ApiKeyHeader { name: String },
ApiKeyQuery { name: String },
ApiKeyCookie { name: String },
HttpBasic,
HttpBearer,
OAuthClientCredentials { token_url: String, scopes: Vec<String> },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractSecurityRequirement {
pub scheme_name: String,
pub kind: ContractSecuritySchemeKind,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ContractOperation {
pub operation_id: Option<String>,
pub summary: Option<String>,
pub method: String,
pub path: String,
pub servers: Vec<String>,
pub tags: Vec<String>,
pub parameters: Vec<ContractParameter>,
pub request_body: Option<ContractRequestBody>,
pub response_body: Option<ContractResponseBody>,
pub security: Vec<Vec<ContractSecurityRequirement>>,
pub source_span: Option<ContractSourceSpan>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct ContractDocument {
pub servers: Vec<String>,
pub scalars: Vec<ContractScalarDefinition>,
pub schemas: Vec<ContractSchemaDefinition>,
pub operations: Vec<ContractOperation>,
}