generate_enum_info!() { /* proc-macro */ }
Expand description

A procedural macro to generate information about an enum.

This macro generates code that uses the EnumDescriptor and VariantDescriptors traits to extract information about an enum, including its name, variant names, and their corresponding token counts. Additionally, it uses the FunctionArgument trait to fetch the argument description. All this information is serialized into JSON.

The macro returns a tuple containing the JSON and the total token count.

Usage

#[generate_enum_info]
enum MyEnum {
    Variant1,
    Variant2,
}

The generated code will look like this:

{
    use serde_json::Value;
    let mut total_tokens = 0;

    let (arg_desc, arg_count) = <MyEnum as ::openai_func_enums::FunctionArgument>::argument_description_with_token_count();
    total_tokens += arg_count;

    let enum_name = <MyEnum as EnumDescriptor>::name_with_token_count();
    total_tokens += enum_name.1;
    total_tokens += enum_name.1;

    let enum_variants = <MyEnum as VariantDescriptors>::variant_names_with_token_counts();
    total_tokens += enum_variants.iter().map(|(_, token_count)| *token_count).sum::<usize>();

    let json_enum = serde_json::json!({
        enum_name.0: {
            "type": "string",
            "enum": enum_variants.iter().map(|(name, _)| name.clone()).collect::<Vec<_>>(),
            "description": arg_desc,
        }
    });

    total_tokens += 11;

    (json_enum, total_tokens)
}

Note: It is assumed that the enum implements the EnumDescriptor, VariantDescriptors, and FunctionArgument traits. The actual token count is computed during compile time using these traits’ methods.