1#![recursion_limit = "128"]
2
3extern crate proc_macro;
4
5mod vars;
6
7use proc_macro::TokenStream;
8use proc_macro2::Span;
9use proc_macro_hack::proc_macro_hack;
10use quote::quote;
11use syn::{parse_macro_input, LitStr};
12
13#[proc_macro_hack]
14pub fn ever(input: TokenStream) -> TokenStream {
15 let version_env = if input.is_empty() {
16 LitStr::new("EVER", Span::call_site())
17 } else {
18 parse_macro_input!(input as LitStr)
19 };
20
21 let name = vars::package_name();
22 let version = vars::package_version();
23 let about = vars::package_description();
24 let date = vars::build_date();
25 let commit = vars::build_commit_hash();
26 let user = vars::build_username();
27 let host = vars::build_hostname();
28 let builddir = vars::build_dir();
29 let rustc = vars::rustc_version();
30 let mode = vars::build_mode();
31 let lock = vars::lock_file();
32
33 let s = quote! {
34 match std::env::var(#version_env).as_deref() {
35 Ok("1") | Ok("true") => {
36
37 println!(
38 r#"{name} {version} ({mode}): {about}
39
40 date: {date}
41 commit: {commit}
42 user: {user}
43 host: {host}
44 builddir: {builddir}
45 rustc: {rustc}"#,
46 name = #name,
47 version = #version,
48 about = #about,
49 date = #date,
50 commit = #commit,
51 user = #user,
52 host = #host,
53 builddir = #builddir,
54 rustc = #rustc,
55 mode = #mode,
56 );
57
58 std::process::exit(1);
59 }
60 Ok("dump_lock") => {
61 println!("{}", #lock);
62 std::process::exit(1);
63 }
64 _ => {}
65 }
66 };
67
68 s.into()
69}
70
71#[proc_macro_hack]
72pub fn package_name(_: TokenStream) -> TokenStream {
73 vars::package_name().into()
74}
75
76#[proc_macro_hack]
77pub fn package_version(_: TokenStream) -> TokenStream {
78 vars::package_version().into()
79}
80
81#[proc_macro_hack]
82pub fn package_description(_: TokenStream) -> TokenStream {
83 vars::package_description().into()
84}
85
86#[proc_macro_hack]
87pub fn build_date(_: TokenStream) -> TokenStream {
88 vars::build_date().into()
89}
90
91#[proc_macro_hack]
92pub fn build_mode(_: TokenStream) -> TokenStream {
93 vars::build_mode().into()
94}
95
96#[proc_macro_hack]
97pub fn build_commit_hash(_: TokenStream) -> TokenStream {
98 vars::build_commit_hash().into()
99}
100
101#[proc_macro_hack]
102pub fn build_username(_: TokenStream) -> TokenStream {
103 vars::build_username().into()
104}
105
106#[proc_macro_hack]
107pub fn build_hostname(_: TokenStream) -> TokenStream {
108 vars::build_hostname().into()
109}
110
111#[proc_macro_hack]
112pub fn build_dir(_: TokenStream) -> TokenStream {
113 vars::build_dir().into()
114}
115
116#[proc_macro_hack]
117pub fn rustc_version(_: TokenStream) -> TokenStream {
118 vars::rustc_version().into()
119}
120
121#[proc_macro_hack]
122pub fn lock_file(_: TokenStream) -> TokenStream {
123 vars::lock_file().into()
124}