pretend-codegen 0.4.0

codegen for pretend.
Documentation
use crate::errors::{UNSUPPORTED_GENERICS, UNSUPPORTED_RECEIVER};
use syn::{Error, FnArg, Receiver, Result, Signature, TraitItemMethod};

pub(crate) fn check_no_generics(method: &TraitItemMethod) -> Result<()> {
    let sig = &method.sig;
    check_no_generic_params(sig)?;
    check_no_where_clause(sig)?;
    Ok(())
}
fn check_no_generic_params(sig: &Signature) -> Result<()> {
    if sig.generics.params.is_empty() {
        Ok(())
    } else {
        Err(Error::new_spanned(&sig.generics, UNSUPPORTED_GENERICS))
    }
}

fn check_no_where_clause(sig: &Signature) -> Result<()> {
    if let Some(where_clause) = sig.generics.where_clause.as_ref() {
        Err(Error::new_spanned(where_clause, UNSUPPORTED_GENERICS))
    } else {
        Ok(())
    }
}

pub(crate) fn check_correct_receiver(method: &TraitItemMethod) -> Result<()> {
    let receiver = get_receiver(method);
    let receiver = receiver.ok_or_else(|| Error::new_spanned(&method.sig, UNSUPPORTED_RECEIVER))?;
    get_good_mutability(receiver).ok_or_else(|| Error::new_spanned(receiver, UNSUPPORTED_RECEIVER))
}

fn get_receiver(method: &TraitItemMethod) -> Option<&Receiver> {
    let sig = &method.sig;
    let first_arg = sig.inputs.first()?;

    match first_arg {
        FnArg::Receiver(receiver) => Some(receiver),
        _ => None,
    }
}

fn get_good_mutability(receiver: &Receiver) -> Option<()> {
    let (_, lifetime) = receiver.reference.as_ref()?;
    if lifetime.is_none() && receiver.mutability.is_none() {
        Some(())
    } else {
        None
    }
}