hen 0.20.1

Run protocol-aware API request collections from the command line or through MCP.
Documentation
mod loader;
mod materialize;
mod selector;

use std::path::Path;

use crate::{contract::ContractDocument, error::HenResult};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OpenApiImportBoundary {
    ContractOnly,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OpenApiSupportLevel {
    Supported,
    Warning,
    Unsupported,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OpenApiCapabilityDiagnostic {
    pub code: &'static str,
    pub level: OpenApiSupportLevel,
    pub message: String,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct OpenApiImportPlan {
    pub boundary: Option<OpenApiImportBoundary>,
    pub contract: ContractDocument,
    pub selected_operations: Vec<usize>,
    pub diagnostics: Vec<OpenApiCapabilityDiagnostic>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OpenApiMaterialization {
    pub source: String,
    pub imported_operations: Vec<usize>,
    pub diagnostics: Vec<OpenApiCapabilityDiagnostic>,
}

impl OpenApiImportPlan {
    pub fn milestone_zero() -> Self {
        Self {
            boundary: Some(OpenApiImportBoundary::ContractOnly),
            contract: ContractDocument::default(),
            selected_operations: Vec::new(),
            diagnostics: vec![OpenApiCapabilityDiagnostic {
                code: "openapi_contract_only",
                level: OpenApiSupportLevel::Supported,
                message: "OpenAPI import is scoped to contract-only materialization into plain .hen requests and schemas.".to_string(),
            }],
        }
    }
}

pub fn plan_import(path: &Path, selector: Option<&str>) -> HenResult<OpenApiImportPlan> {
    let mut plan = loader::load_import_plan(path)?;
    plan.selected_operations = selector::resolve_selected_operations(&plan.contract.operations, selector)?;
    Ok(plan)
}

pub fn materialize_import(plan: &OpenApiImportPlan) -> OpenApiMaterialization {
    materialize::materialize_import(plan)
}