// rustfmt-overflow_delimited_expr: true

fn combine_blocklike() {
    do_thing(|param| {
        action();
        foo(param)
    });

    do_thing(x, |param| {
        action();
        foo(param)
    });

    do_thing(
        x,
        // I'll be discussing the `action` with your para(m)legal counsel
        |param| {
            action();
            foo(param)
        },
    );

    do_thing(Bar {
        x: value,
        y: value2,
    });

    do_thing(x, Bar {
        x: value,
        y: value2,
    });

    do_thing(
        x,
        // Let me tell you about that one time at the `Bar`
        Bar {
            x: value,
            y: value2,
        },
    );

    do_thing(&[
        value_with_longer_name,
        value2_with_longer_name,
        value3_with_longer_name,
        value4_with_longer_name,
    ]);

    do_thing(x, &[
        value_with_longer_name,
        value2_with_longer_name,
        value3_with_longer_name,
        value4_with_longer_name,
    ]);

    do_thing(
        x,
        // Just admit it; my list is longer than can be folded on to one line
        &[
            value_with_longer_name,
            value2_with_longer_name,
            value3_with_longer_name,
            value4_with_longer_name,
        ],
    );

    do_thing(vec![
        value_with_longer_name,
        value2_with_longer_name,
        value3_with_longer_name,
        value4_with_longer_name,
    ]);

    do_thing(x, vec![
        value_with_longer_name,
        value2_with_longer_name,
        value3_with_longer_name,
        value4_with_longer_name,
    ]);

    do_thing(
        x,
        // Just admit it; my list is longer than can be folded on to one line
        vec![
            value_with_longer_name,
            value2_with_longer_name,
            value3_with_longer_name,
            value4_with_longer_name,
        ],
    );

    do_thing(
        x,
        (1, 2, 3, |param| {
            action();
            foo(param)
        }),
    );
}

fn combine_struct_sample() {
    let identity = verify(&ctx, VerifyLogin {
        type_: LoginType::Username,
        username: args.username.clone(),
        password: Some(args.password.clone()),
        domain: None,
    })?;
}

fn combine_macro_sample() {
    rocket::ignite()
        .mount("/", routes![
            http::auth::login,
            http::auth::logout,
            http::cors::options,
            http::action::dance,
            http::action::sleep,
        ])
        .launch();
}
