I've found blank_lines_lower_bound, but it will require all items split by multiple blank lines. A more useful rule is that only apply blank lines for mod-level items.
e.g.
struct A {
v1: i32
}
fn handle(a: A) {
do_something(&a);
do_something(&a);
}
After format with blank_lines_in_mod_lower_bound = 1
struct A {
v1: i32
}
fn handle(a: A) {
do_something(&a);
do_something(&a);
}
We can keep no blank lines between two do_something(&a), and insert a blank line between two top-level definition.
IMO, this would make a lot of sense. It could either be about "items in a mod or an impl", or it could be about "items that aren't statements". The latter approach would mean that e. g. an fn or a struct definition inside of a function would get spaces, too. If the latter approach was taken, macro invocations that can evaluate to items or statements could still be useful to distinguish by location, i. e. require spaces for a macro invocation only on top-level-ish stuff, i. e. in a mod or an impl.