If I understand, you can call line! in main (as well as in bust), and create a new error. The new error could supersede the first error. Or it could wrap the first error -- then you have nested errors showing both locations.
I don't quite understand that. Or I don't know how to do it yet. In any case, the code shows the error in the line of bust where it is initialized with new - and not where bust is called, i.e. in main. And this behavior is not very practical. At some point, the code is light years away from 'main' - and the lively search begins.
Up to you, there are several ways. My typing is too slow (arm in a sling). I suggest using anyhow -- look at how errors are wrapped/nested. Or wait for others to explain how to do this without a library crate. But note that anyhow is very popular to reduce boilerplate for error handling.
That's the most general solution. For many simple cases of error helpers, though, you may be able to just use #[track_caller] and std::panic::Location instead of the file!/line! macros (which still always report the expansion source line).
Or you can capture a backtrace for a fuller picture of the call stack, like is displayed for panics. Crates that provide an "application error" type like anyhow generally capture a backtrace for you when the error is created, since it's the most widely useful tool to see where the error came from.
To use anyhow, you'd return anyhow::Error as your error type instead of Fuba. If the only thing you'll ever do for an error is log and discard it, using an "application error" type is appropriate. "Library error" types are useful when enumerating the potential failure cases is a thing that code can find useful.