I do a combination of 1) and 3). I do 1) if the entry point is also private, 3) for public APIs.
I was used to use the do_
style which I inherited from Erlang. Today I usually avoid it though given def do_... do
ends up being too many do’s in a row.