// トレイト参照用
mod traits;
use traits::DeriveTrait;

// マクロ参照用
use macros::DeriveTrait;

// deriveマクロのテスト用構造体
#[derive(DeriveTrait)]
struct DeriveStruct;

// 理解度チェック用
use traits::DeriveItem;
use macros::DeriveItem;

#[derive(DeriveItem)]
struct SomeStruct(String);

fn main() {
    // 関数風マクロの呼び出し
    println!("as_is!(1 + 2) = {}", macros::as_is!(1 + 2));
    println!("my_power!(1 + 2) = {}", macros::my_power!(1 + 2));
    println!("to_sub!(1 + 2) = {}", macros::to_sub!(1 + 2));

    // deriveマクロの呼び出し
    let ds = DeriveStruct;
    println!("{}", ds.introduce());

    // 属性風マクロの呼び出し
    call_attribute();
 
    // 理解度チェック用マクロの呼び出し
    macros::generate_func!(some_generated_function);
    some_generated_function();

    println!("データ型は {} です。", SomeStruct("Hello".to_string()).get_type());
}

// 属性風マクロ用
use macros::measure_time;

#[measure_time(call_attribute)]
fn call_attribute() {
    println!("時間のかかる処理");
    std::thread::sleep(std::time::Duration::from_millis(1000));
}
