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)
}