autapi 0.0.1

Automatic OpenAPI specification from function signatures
Documentation
use std::borrow::Cow;

use serde_json::Value;

use crate::{
    Registry,
    openapi::{Format, MaybeRef, Schema, Type},
    schema::{ToSchema, macros::transparent_serde},
};

macro_rules! impl_primitive {
    ($ty:ident $(, $schema_type:expr $(, $format:expr)?)? $(; $original:ty)?) => {
        impl ToSchema for $ty {
            type Original = impl_primitive!(@original $($original)?);

            const REQUIRED: bool = true;
            const ALWAYS_INLINED: bool = true;
            fn name() -> Cow<'static, str> {
                stringify!($ty).into()
            }
            fn schema(#[expect(unused)] registry: &mut Registry) -> MaybeRef<Schema> {
                MaybeRef::T(Schema::default()
                   $(
                       .with_schema_type($schema_type)
                       $(.with_format($format),)?
                   )?
                )
            }
        }

        transparent_serde!(serde $ty<>);
    };
    (@original) => { Self };
    (@original $ty:ty) => { $ty };
}

impl_primitive!(bool, Type::Boolean);

type Unit = ();
impl_primitive!(Unit, Type::Null);

impl_primitive!(i8, Type::Integer, Format::Int8);
impl_primitive!(i16, Type::Integer, Format::Int16);
impl_primitive!(i32, Type::Integer, Format::Int32);
impl_primitive!(i64, Type::Integer, Format::Int64);
impl_primitive!(i128, Type::Integer);

impl_primitive!(u8, Type::Integer, Format::Uint8);
impl_primitive!(u16, Type::Integer, Format::Uint16);
impl_primitive!(u32, Type::Integer, Format::Uint32);
impl_primitive!(u64, Type::Integer, Format::Uint64);
impl_primitive!(u128, Type::Integer);

impl_primitive!(f32, Type::Number, Format::Float);
impl_primitive!(f64, Type::Number, Format::Double);

impl_primitive!(String, Type::String);
impl_primitive!(str, Type::String; String);

impl_primitive!(Value);