nongoose-derive 0.1.0-beta.1

Macros implementation of #[derive(Schema)]
Documentation
use proc_macro2::TokenStream;
use quote::{format_ident, quote};

use crate::schema::data::SchemaData;

pub(crate) fn getter(schema_data: &SchemaData) -> TokenStream {
  let nongoose = crate::utils::crates::get_nongoose_crate_name();

  if !schema_data.unique.is_empty() {
    let mut idents = quote!();
    for field in schema_data.unique.iter() {
      let ident = field.ident.as_ref().unwrap();
      let ident_str = format!("{}", ident);

      let value = quote!(self.#ident);

      if let Some(lit) = schema_data.convert.get(ident) {
        let convert_ident = format_ident!("{}", lit.value());
        idents.extend(quote! {
          (
            #nongoose::bson::doc! { #ident_str: #convert_ident(#value.clone()) },
            #ident_str,
            #value.clone().to_string(),
          ),
        });
      } else {
        idents.extend(quote! {
          (
            #nongoose::bson::doc! { #ident_str: #value.clone() },
            #ident_str,
            #value.clone().to_string(),
          ),
        });
      }
    }

    quote! {
      fn __check_unique_fields(&self) -> #nongoose::Result<()> {
        let data = vec![#idents];
        for (document, field, value) in data {
          if let Some(doc) = Self::__get_database(None)
            .collection::<#nongoose::bson::Document>(Self::__get_collection_name().as_str())
            .find_one(document, None)?
          {
            let data: Self = #nongoose::bson::from_bson(#nongoose::bson::Bson::Document(doc))?;
            if self.__get_id() != data.__get_id() {
              return Err(#nongoose::Error::DuplicatedSchemaField(field.to_string(), value.to_string()));
            }
          }
        }

        Ok(())
      }
    }
  } else {
    quote! {
      fn __check_unique_fields(&self) -> #nongoose::Result<()> {
        Ok(())
      }
    }
  }
}