nongoose-derive 0.1.0-beta.1

Macros implementation of #[derive(Schema)]
Documentation
use syn::{DeriveInput, Lit, Meta, NestedMeta};

pub(crate) fn get_name(input: &DeriveInput) -> String {
  let attrs = &input.attrs;
  let mut result = None;

  for attr in attrs {
    if !super::attributes::is_schema(attr) {
      continue;
    }

    let attr = super::attributes::parse(attr);
    for opt in attr.nested {
      let nv = match opt {
        NestedMeta::Meta(Meta::NameValue(nv)) => nv,
        _ => continue,
      };

      if nv.path.is_ident("name") {
        match nv.lit {
          Lit::Str(lit) => result = Some(lit.value()),
          _ => continue,
        }
      }
    }
  }

  result.unwrap_or_else(|| {
    let ident = input.ident.to_string();
    let mut new_ident = String::new();

    for letter in ident.as_bytes().iter() {
      if letter.is_ascii_uppercase() {
        if !new_ident.is_empty() {
          new_ident.push('_');
        }

        new_ident.push(letter.to_ascii_lowercase() as char);
      } else {
        new_ident.push(*letter as char);
      }
    }

    format!("{}s", new_ident)
  })
}