use proc_macro2::TokenStream;
use quote::quote;
use syn::{Ident, Type};

pub fn impl_zero(struct_name: &Ident) -> TokenStream {
    quote! {
        impl num_traits::Zero for #struct_name {
            fn zero() -> Self {
                Self::new(0)
            }

            fn is_zero(&self) -> bool {
                self.0 == Self::zero().0
            }
        }
    }
}

pub fn impl_one(struct_name: &Ident) -> TokenStream {
    quote! {
        impl num_traits::One for #struct_name {
            fn one() -> Self {
                Self::new(1)
            }

            fn is_one(&self) -> bool {
                self.0 == Self::one().0
            }
        }
    }
}

pub fn impl_num(struct_name: &Ident, ty: &Type) -> TokenStream {
    quote! {
        impl num_traits::Num for #struct_name {
            type FromStrRadixErr = std::num::ParseIntError;

            fn from_str_radix(s: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
                let value = #ty::from_str_radix(s, radix)?;
                Ok(Self::new(value))
            }
        }
    }
}
