getargs-derive-macros 0.1.0

Internal implementation detail of getargs-derive. Not meant for direct use; depend on getargs-derive instead.
Documentation
use crate::model::FieldModel;
use proc_macro2::TokenStream;
use quote::quote;

pub(super) fn allows_negative_numbers(field: &FieldModel) -> TokenStream {
    if field.parsing.allow_negative_numbers {
        quote! { true }
    } else {
        quote! { __context.negative_numbers }
    }
}

pub(super) fn option_value(field: &FieldModel, missing: TokenStream) -> TokenStream {
    let next = quote! { __options.value().map_err(|_| #missing)? };
    if field.parsing.allow_hyphen_values {
        return quote! { #next };
    }
    let allow_negative_numbers = allows_negative_numbers(field);
    quote! {
        match __options.value_opt() {
            core::option::Option::Some(value) => value,
            core::option::Option::None => {
                let value = #next;
                if !getargs_derive::__accepts_value(value, #allow_negative_numbers) {
                    return Err(#missing);
                }
                value
            }
        }
    }
}

pub(super) fn negative_positional(
    field: &FieldModel,
    slot: &TokenStream,
    earlier: &TokenStream,
    parsed: &TokenStream,
) -> TokenStream {
    let allow_negative_numbers = allows_negative_numbers(field);
    let store = if field.parsing.last {
        quote! { return Err(getargs_derive::Error::UnexpectedArgument(value)); }
    } else {
        quote! {
            #slot = core::option::Option::Some(#parsed);
            return core::result::Result::Ok(true);
        }
    };
    quote! {
        if let getargs_derive::__private::Arg::Short(short) = __argument {
            if #allow_negative_numbers
                && !__context.blocked
                && #earlier
                && #slot.is_none()
            {
                if let core::option::Option::Some(value) =
                    getargs_derive::__negative_number(__context.raw, short)
                {
                    let _ = __options.value_opt();
                    #store
                }
            }
        }
    }
}

pub(super) fn positional(
    field: &FieldModel,
    slot: &TokenStream,
    parsed: &TokenStream,
) -> TokenStream {
    let accepts = if field.parsing.last {
        quote! { __options.opts_ended() }
    } else {
        quote! { !(__last && __options.opts_ended()) }
    };
    quote! {
        if let getargs_derive::__private::Arg::Positional(value) = __argument {
            if #slot.is_none() && #accepts {
                #slot = core::option::Option::Some(#parsed);
                return core::result::Result::Ok(true);
            }
        }
    }
}