they're all the same structure, so I abstracted them together - felt clearer. (especially because I wanted to print which op failed if any)