Cambie la variante de enumeración mientras mueve el campo a la nueva variante

Quiero actualizar una variante enum mientras muevo un campo de la variante anterior a la nueva sin ninguna clonación:

enum X {
    X1(String),
    X2(String),
}

fn increment_x(x: &mut X) {
    match x {
        &mut X::X1(s) => {
            *x = X::X2(s);
        }
        &mut X::X2(s) => {
            *x = X::X1(s);
        }
    }
}

Esto no funciona porque no podemos movernoss de&mut X.

Por favor no sugiera cosas como implementar unenum X { X1, X2 } y usandostruct S { variant: X, str: String } etc. Este es un ejemplo simplificado, imagine tener muchos otros campos en variantes y querer mover un campo de una variante a otra.

Respuestas a la pregunta(2)

Su respuesta a la pregunta