Ownership is tracked per field, not only per value.
Moving one field out of a struct leaves the struct partially moved: the field you took is dead, every other field is still readable.
struct Account { id: String, balance: i64 }
let acct = Account { id: String::from("GA7Q"), balance: 250 };
let id = acct.id; // moves out just this field
println!("{}", acct.balance); // fine
println!("{}", acct.id); // error: value moved
println!("{:?}", acct); // error: `acct` is not whole any more
