Review a generated pinned job

from Pin and Unpin
Rust 1.98 advanced 8 min 4 issues to find

Review this generated address-sensitive job type.

Keep payload_ptr pointing to payload after construction, permit appending without exposing a movable field reference, preserve pinning through destruction, and produce no output on drop.

Rust
use std::marker::PhantomPinned;
use std::pin::Pin;
struct Job {
    payload: String,
    payload_ptr: *const String,
    _pin: PhantomPinned,
}
impl Job {
    fn new(payload: String) -> Pin<Box<Self>> {
        let mut job = Self { payload, payload_ptr: std::ptr::null(), _pin: PhantomPinned };
        job.payload_ptr = &job.payload;
        Box::pin(job)
    }
    fn payload_mut(self: Pin<&mut Self>) -> &mut String {
        unsafe { &mut self.get_unchecked_mut().payload }
    }
}
impl Drop for Job {
    fn drop(&mut self) {
        let _saved = std::mem::take(&mut self.payload);
        println!("dropping job");
    }
}

generated code is illustrative, not from any one model

Open in playground
Report an error