You may be better off working with missing, instead of nothing. Unlike nothing, missing is designed to propagate, and has ready-made utilities to make propagation easier.
See passmissing from Missings.jl
help?> passmissing
search: passmissing
passmissing(f)
Return a function that returns missing if any of its positional
arguments are missing (even if their number or type is not consistent
with any of the methods defined for f) and otherwise applies f to these
arguments.
One of the conceptual distinctions between nothing and missing (imo) is that nothing is handled immediately (sometimes by converting to missing) or an error is thrown.
Where as missing is propagated until it is handled (e.g. with imputation) or until it can’t be supported and then an error is thrown