Skip to main content

chio_openapi/
lib.rs

1//! OpenAPI 3.x spec parser and Chio `ToolManifest` generator.
2//!
3//! This crate parses OpenAPI 3.0 and 3.1 specifications (both YAML and JSON)
4//! and generates Chio `ToolManifest` values where each route becomes a
5//! `ToolDefinition` with input schema derived from path, query, and body
6//! parameters.
7
8mod extensions;
9mod generator;
10mod parser;
11mod policy;
12
13pub use extensions::{ChioExtensions, Sensitivity};
14pub use generator::{GeneratorConfig, ManifestGenerator};
15pub use parser::{OpenApiSpec, Operation, Parameter, ParameterLocation, PathItem};
16pub use policy::{DefaultPolicy, PolicyDecision};
17
18use thiserror::Error;
19
20/// Errors produced by the OpenAPI parser and manifest generator.
21#[derive(Debug, Error)]
22pub enum OpenApiError {
23    /// The input is not valid JSON.
24    #[error("invalid JSON: {0}")]
25    InvalidJson(#[from] serde_json::Error),
26
27    /// The input is not valid YAML.
28    #[error("invalid YAML: {0}")]
29    InvalidYaml(#[from] serde_yml::Error),
30
31    /// The OpenAPI spec is missing a required field.
32    #[error("missing required field: {0}")]
33    MissingField(String),
34
35    /// The OpenAPI version is not supported.
36    #[error("unsupported OpenAPI version: {0}")]
37    UnsupportedVersion(String),
38
39    /// A `$ref` could not be resolved.
40    #[error("unresolved reference: {0}")]
41    UnresolvedRef(String),
42}
43
44/// Result alias for this crate.
45pub type Result<T> = std::result::Result<T, OpenApiError>;
46
47/// Convenience function: parse an OpenAPI spec from a string (auto-detecting
48/// JSON vs YAML) and generate a list of `ToolDefinition` values.
49///
50/// For more control, use `OpenApiSpec::parse` and `ManifestGenerator`
51/// directly.
52pub fn tools_from_spec(input: &str) -> Result<Vec<chio_core_types::ToolDefinition>> {
53    let spec = OpenApiSpec::parse(input)?;
54    let generator = ManifestGenerator::new(GeneratorConfig::default());
55    Ok(generator.generate_tools(&spec))
56}