You can't take ownerships of fields of objects from &mut, even if it is temporary.
If you want to do such things, you should basically choose option 2.
This problem is related to panic safety.
See the documentation of take_mut crate for detail.
(This crate enables taking ownership temporarily from &mut in safe way, using unsafe internally.)
An alternative without unsafe would be to simply use mem::replace(), then write back the new value. This often works, provided you can make up a new instance of the type on the spot.