clientix-codegen 0.2.0

Library for building HTTP clients and requests declaratively with procedural macros - no need to write complex imperative or functional logic.
Documentation
use quote::quote;
use syn::__private::TokenStream2;
use crate::attributes::header::HeaderAttributes;
use crate::method::signature::segment::SegmentArgumentCompiler;

#[derive(Clone, Debug)]
pub struct HeaderCompiler {
    attributes: HeaderAttributes,
}

impl HeaderCompiler {

    pub fn new(name: Option<String>, value: Option<String>, sensitive: bool) -> Self {
        Self { attributes: HeaderAttributes::new(name, value, sensitive) }
    }

    pub fn parse(attrs: TokenStream2, dry_run: bool) -> Self {
        Self { attributes: HeaderAttributes::parse(attrs, dry_run) }
    }

    pub fn compile(&self, segments: &Vec<SegmentArgumentCompiler>) -> TokenStream2 {
        if self.attributes.name().is_none() && self.attributes.value().is_none() {
            return quote! {}
        }

        let name = self.attributes.name().clone().unwrap();
        let value = self.attributes.value().clone().unwrap();
        let sensitive = self.attributes.sensitive();

        let mut stream = TokenStream2::new();
        if !segments.is_empty() {
            stream.extend(quote!(let mut arguments = std::collections::HashMap::new();));

            for segment_argument in segments.iter() {
                let name = segment_argument.name();
                let value = segment_argument.value();
                stream.extend(quote! {
                    if let Some(segment) = #value {
                        arguments.insert(#name.to_string(), segment.to_string());
                    }
                });
            }

            stream.extend(quote!(clientix::prelude::strfmt::strfmt(#value, &arguments).expect("failed to format header").as_str()));

            TokenStream2::from(quote!(let builder = builder.header(#name, {#stream}, #sensitive);))
        } else {
            TokenStream2::from(quote!(let builder = builder.header(#name, #value, #sensitive);))
        }
    }

}