ever_macro/
lib.rs

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}