#![warn(
clippy::all,
clippy::dbg_macro,
clippy::todo,
clippy::empty_enum,
clippy::enum_glob_use,
clippy::mem_forget,
clippy::unused_self,
clippy::filter_map_next,
clippy::needless_continue,
clippy::needless_borrow,
clippy::match_wildcard_for_single_variants,
clippy::if_let_mutex,
clippy::mismatched_target_os,
clippy::await_holding_lock,
clippy::match_on_vec_items,
clippy::imprecise_flops,
clippy::suboptimal_flops,
clippy::lossy_float_literal,
clippy::rest_pat_in_fully_bound_structs,
clippy::fn_params_excessive_bools,
clippy::exit,
clippy::inefficient_to_string,
clippy::linkedlist,
clippy::macro_use_imports,
clippy::option_option,
clippy::verbose_file_reads,
clippy::unnested_or_patterns,
rust_2018_idioms,
future_incompatible,
nonstandard_style,
missing_debug_implementations,
missing_docs
)]
#![deny(unreachable_pub, private_in_public)]
#![allow(elided_lifetimes_in_paths, clippy::type_complexity)]
#![forbid(unsafe_code)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(test, allow(clippy::float_cmp))]
#[cfg(feature = "__internal_http")]
mod http;
#[cfg(feature = "github")]
mod github;
#[cfg(feature = "time")]
mod time;
#[cfg(feature = "crate")]
mod krate;
#[cfg(feature = "rust")]
mod rust;
#[cfg(feature = "github")]
#[proc_macro]
pub fn issue_closed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
perform_check(input, github::issue_closed)
}
#[cfg(feature = "github")]
#[proc_macro]
pub fn pr_closed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
perform_check(input, github::pr_closed)
}
#[cfg(feature = "time")]
#[proc_macro]
pub fn after_date(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
perform_check(input, time::after_date)
}
#[cfg(feature = "crate")]
#[proc_macro]
pub fn crates_io(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
perform_check(input, krate::crates_io)
}
#[cfg(feature = "rust")]
#[proc_macro]
pub fn rust_version(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
perform_check(input, rust::rust_version)
}
#[allow(dead_code)]
fn perform_check<F, T>(input: proc_macro::TokenStream, f: F) -> proc_macro::TokenStream
where
F: FnOnce(T) -> anyhow::Result<Option<String>>,
T: syn::parse::Parse,
{
if std::env::var("TODO_OR_DIE_SKIP").is_ok() {
return Default::default();
}
let input = match syn::parse::<T>(input) {
Ok(value) => value,
Err(err) => {
let err = err.to_string();
return quote::quote! {
::std::compile_error!(#err);
}
.into();
}
};
match f(input) {
Ok(None) => {}
Ok(Some(msg)) => {
return quote::quote! {
::std::compile_error!(#msg);
}
.into();
}
Err(err) => {
eprintln!("something went wrong\n\n{:?}", err);
}
}
Default::default()
}