getargs-derive-macros 0.1.0

Internal implementation detail of getargs-derive. Not meant for direct use; depend on getargs-derive instead.
Documentation
use super::RawField;
use crate::model::attr::set_once;
use proc_macro2::Span;
use syn::{Lit, Token, meta::ParseNestedMeta, spanned::Spanned};

pub(super) fn env(meta: &ParseNestedMeta, raw: &mut RawField) -> syn::Result<()> {
    let value = if meta.input.peek(Token![=]) {
        match meta.value()?.parse::<Lit>()? {
            Lit::Str(literal) => (Some(literal.value()), literal.span()),
            other => {
                return Err(syn::Error::new(
                    other.span(),
                    "`env` expects a string literal, e.g. `env = \"PORT\"`",
                ));
            }
        }
    } else {
        (None, meta.path.span())
    };
    set_once(&mut raw.env, value, meta)
}

pub(super) fn validate_env(name: &str, span: Span) -> syn::Result<()> {
    if name.is_empty() {
        return Err(syn::Error::new(span, "`env` cannot be empty"));
    }
    if name.contains(['=', '\0']) {
        return Err(syn::Error::new(
            span,
            "`env` cannot contain `=` or NUL characters",
        ));
    }
    Ok(())
}