kago-macros 0.3.0

A macros for Kago.
Documentation
use proc_macro2::TokenStream;
use quote::quote;
use syn::Ident;

pub fn impl_not(struct_name: &Ident, masking: &TokenStream) -> TokenStream {
    quote! {
        impl std::ops::Not for #struct_name {
            type Output = Self;
            fn not(self) -> Self {
                Self::from_bits((!self.0) #masking)
            }
        }
    }
}

pub fn impl_bitand(struct_name: &Ident, masking: &TokenStream) -> TokenStream {
    quote! {
        impl std::ops::BitAnd for #struct_name {
            type Output = Self;
            fn bitand(self, rhs: Self) -> Self {
                Self::from_bits((self.0 & rhs.0) #masking)
            }
        }
    }
}

pub fn impl_bitor(struct_name: &Ident, masking: &TokenStream) -> TokenStream {
    quote! {
        impl std::ops::BitOr for #struct_name {
            type Output = Self;
            fn bitor(self, rhs: Self) -> Self {
                Self::from_bits((self.0 | rhs.0) #masking)
            }
        }
    }
}

pub fn impl_bitxor(struct_name: &Ident, masking: &TokenStream) -> TokenStream {
    quote! {
        impl std::ops::BitXor for #struct_name {
            type Output = Self;
            fn bitxor(self, rhs: Self) -> Self {
                Self::from_bits((self.0 ^ rhs.0) #masking)
            }
        }
    }
}

pub fn impl_shl(struct_name: &Ident) -> TokenStream {
    quote! {
        impl std::ops::Shl<usize> for #struct_name {
            type Output = Self;
            fn shl(self, rhs: usize) -> Self {
                Self::from_bits((self.0 << rhs))
            }
        }
    }
}

pub fn impl_shr(struct_name: &Ident, masking: &TokenStream) -> TokenStream {
    quote! {
        impl std::ops::Shr<usize> for #struct_name {
            type Output = Self;
            fn shr(self, rhs: usize) -> Self {
                Self::from_bits((self.0 >> rhs) #masking)
            }
        }
    }
}