mcp-forge 0.1.5

Generate Rust MCP servers from OpenAPI specs
#![cfg(test)]

use crate::ir::{
    ApiSpec, AuthMethod, EnumVariant, FieldDef, HttpMethod, Operation, RustType, TypeDef,
};
use heck::{ToSnakeCase, ToUpperCamelCase};

#[must_use]
pub fn make_field(name: &str, rust_type: RustType, required: bool) -> FieldDef {
    FieldDef {
        name: name.into(),
        rust_name: name.to_snake_case(),
        rust_type,
        required,
        description: None,
        default_value: None,
    }
}

#[must_use]
pub fn make_struct(name: &str, fields: Vec<FieldDef>) -> TypeDef {
    TypeDef {
        name: name.into(),
        rust_name: name.to_upper_camel_case(),
        fields,
        is_enum: false,
        enum_variants: Vec::new(),
        description: None,
    }
}

#[must_use]
pub fn make_enum(name: &str, variants: Vec<&str>) -> TypeDef {
    TypeDef {
        name: name.into(),
        rust_name: name.to_upper_camel_case(),
        fields: Vec::new(),
        is_enum: true,
        enum_variants: variants
            .into_iter()
            .map(|v| EnumVariant {
                name: v.into(),
                rust_name: v.to_upper_camel_case(),
            })
            .collect(),
        description: None,
    }
}

#[must_use]
pub fn make_spec_with(types: Vec<TypeDef>, operations: Vec<Operation>) -> ApiSpec {
    ApiSpec {
        name: "TestApi".into(),
        description: None,
        version: "1.0.0".into(),
        base_url: None,
        auth: AuthMethod::None,
        operations,
        types,
    }
}

#[must_use]
pub fn make_get_op(id: &str, response_type: RustType) -> Operation {
    Operation {
        id: id.into(),
        method: HttpMethod::Get,
        path: format!("/{id}"),
        summary: Some(format!("Get {id}")),
        description: None,
        parameters: vec![],
        request_body: None,
        response_type: Some(response_type),
        errors: vec![],
    }
}