hen 0.20.1

Run protocol-aware API request collections from the command line or through MCP.
Documentation
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>,
}