ownership-derive 0.3.0

Derive macros for obtaining ownership.
Documentation
use syn::{AngleBracketedGenericArguments, Generics, Ident};

use crate::{
    ast::Container,
    attributes::{ContainerAttributes, FieldAttributes, VariantAttributes},
    bounds::{apply_build, remove_defaults},
};

pub struct Parameters {
    pub name: Ident,
    pub generics: Generics,
    pub generic_arguments: AngleBracketedGenericArguments,
}

impl Parameters {
    pub fn new(container: &Container<'_>) -> Self {
        let name = container.name.clone();

        let (generics, generic_arguments) = Self::build_generics(container);

        Self {
            name,
            generics,
            generic_arguments,
        }
    }

    pub fn build_generics(container: &Container<'_>) -> (Generics, AngleBracketedGenericArguments) {
        let mut generics = container.generics.clone();

        remove_defaults(&mut generics);

        let generic_arguments = apply_build(container, &mut generics, Self::not_as_is);

        (generics, generic_arguments)
    }

    pub fn not_as_is(
        container: &ContainerAttributes,
        field: &FieldAttributes,
        variant_option: Option<&VariantAttributes>,
    ) -> bool {
        !container.as_is()
            && !field.as_is()
            && variant_option.is_none_or(|variant| !variant.as_is())
    }
}