#
enum_ordinalize_derive/
int_wrapper.rs

    1use proc_macro2::{Literal, TokenStream};
    2use quote::{quote, ToTokens, TokenStreamExt};
    3use syn::Expr;
    4
    5use crate::int128::Int128;
    6
    7pub(crate) enum IntWrapper {
    8    Integer(Int128),
    9    Constant(Expr, usize),
    10}
    11
    12impl From<Int128> for IntWrapper {
    13    #[inline]
    14    fn from(v: Int128) -> IntWrapper {
    15        Self::Integer(v)
    16    }
    17}
    18
    19impl From<i128> for IntWrapper {
    20    #[inline]
    21    fn from(v: i128) -> IntWrapper {
    22        Self::Integer(Int128::from(v))
    23    }
    24}
    25
    26impl From<(&Expr, usize)> for IntWrapper {
    27    #[inline]
    28    fn from((expr, counter): (&Expr, usize)) -> IntWrapper {
    29        Self::Constant(expr.clone(), counter)
    30    }
    31}
    32
    33impl ToTokens for IntWrapper {
    34    #[inline]
    35    fn to_tokens(&self, tokens: &mut TokenStream) {
    36        match self {
    37            Self::Integer(v) => {
    38                let lit = match v {
    39                    Int128::Signed(i) => Literal::i128_unsuffixed(*i),
    40                    Int128::Unsigned(u) => Literal::u128_unsuffixed(*u),
    41                };
    42
    43                tokens.append(lit);
    44            },
    45            Self::Constant(expr, counter) => {
    46                let counter = *counter;
    47
    48                if counter > 0 {
    49                    tokens.extend(quote!(#expr +));
    50                    tokens.append(Literal::usize_unsuffixed(counter));
    51                } else {
    52                    tokens.extend(quote!(#expr));
    53                }
    54            },
    55        }
    56    }
    57}