a3s-boot-macros 0.1.2

Attribute macros for a3s-boot
Documentation
use super::attrs::{
    CacheSpec, HostSpec, MetadataSpec, PipelineSpec, RouteResponseSpec, SerializationSpec,
    VersionSpec,
};
use quote::quote;
use syn::Result;

pub(super) fn metadata_route_definition(
    mut route_definition: proc_macro2::TokenStream,
    metadata_specs: &[MetadataSpec],
) -> proc_macro2::TokenStream {
    for spec in metadata_specs {
        let key = &spec.key;
        let value = &spec.value;
        route_definition = quote! {
            (#route_definition).with_metadata(#key, #value)?
        };
    }
    route_definition
}

pub(super) fn cache_route_definition(
    mut route_definition: proc_macro2::TokenStream,
    cache_specs: &[CacheSpec],
) -> proc_macro2::TokenStream {
    for spec in cache_specs {
        let token = spec.token();
        route_definition = quote! {
            (#route_definition).#token
        };
    }
    route_definition
}

pub(super) fn response_route_definition(
    mut route_definition: proc_macro2::TokenStream,
    response_specs: &[RouteResponseSpec],
) -> Result<proc_macro2::TokenStream> {
    for spec in response_specs {
        let token = spec.token()?;
        route_definition = quote! {
            (#route_definition).#token
        };
    }
    Ok(route_definition)
}

pub(super) fn pipeline_route_definition(
    mut route_definition: proc_macro2::TokenStream,
    pipeline_specs: &[PipelineSpec],
) -> proc_macro2::TokenStream {
    for spec in pipeline_specs {
        let token = spec.token();
        route_definition = quote! {
            (#route_definition).#token
        };
    }
    route_definition
}

pub(super) fn host_route_definition(
    route_definition: proc_macro2::TokenStream,
    host_spec: Option<&HostSpec>,
) -> proc_macro2::TokenStream {
    let Some(spec) = host_spec else {
        return route_definition;
    };
    let token = spec.token();
    quote! {
        (#route_definition).#token?
    }
}

pub(super) fn version_route_definition(
    route_definition: proc_macro2::TokenStream,
    version_spec: Option<&VersionSpec>,
) -> proc_macro2::TokenStream {
    let Some(spec) = version_spec else {
        return route_definition;
    };
    let token = spec.token();
    quote! {
        (#route_definition).#token
    }
}

pub(super) fn serialization_route_definition(
    route_definition: proc_macro2::TokenStream,
    serialization_spec: Option<&SerializationSpec>,
) -> proc_macro2::TokenStream {
    let Some(spec) = serialization_spec else {
        return route_definition;
    };
    let token = spec.token();
    quote! {
        (#route_definition).#token
    }
}