satay-codegen 0.1.0

Generate Rust client code from OpenAPI 3.1 documents
Documentation
use syn::parse_quote;

use crate::model::{Operation, ResponseCase};

use super::super::{doc_attrs, ident, rust_type};

pub(super) fn render_response(operation: &Operation) -> syn::ItemEnum {
    let name = ident(&operation.response_name);
    let docs = doc_attrs(operation.description.as_deref());
    let mut variants = operation
        .responses
        .iter()
        .map(render_response_variant)
        .collect::<Vec<_>>();
    variants.push(parse_quote!(UnexpectedStatus(http::StatusCode, Vec<u8>)));

    parse_quote!(
        #(#docs)*
        #[derive(Debug, Clone, PartialEq)]
        pub enum #name {
            #(#variants),*
        }
    )
}

fn render_response_variant(response: &ResponseCase) -> syn::Variant {
    let name = ident(&response.variant_name);
    let docs = doc_attrs(response.description.as_deref());
    match &response.body {
        Some(body) => {
            let body = rust_type(body);
            parse_quote!(#(#docs)* #name(#body))
        }
        None => parse_quote!(#(#docs)* #name),
    }
}