nonzero 0.2.0

Statically checked non-zero integers
Documentation
mod nonzero;

use proc_macro::TokenStream;
use proc_macro2::Span;
use syn::parse::{Parse, ParseStream, Result};

pub(crate) struct SignedInteger {
    is_negative: bool,
    literal: syn::LitInt,
    span: Span,
}

impl Parse for SignedInteger {
    fn parse(input: ParseStream) -> Result<Self> {
        use syn::Token;

        let span = input.span();
        let is_negative = if input.peek(Token![-]) {
            input.parse::<Token![-]>()?;
            true
        } else {
            false
        };
        let literal = input.parse::<syn::LitInt>()?;

        let output = SignedInteger {
            is_negative,
            literal,
            span,
        };

        Ok(output)
    }
}

#[proc_macro]
pub fn nonzero(input: TokenStream) -> TokenStream {
    let integer = syn::parse_macro_input!(input as SignedInteger);
    let result = nonzero::nonzero(integer);
    match result {
        Ok(tokens) => tokens,
        Err(err) => err.into_compile_error(),
    }
    .into()
}