A mailbox can be modeled as a queue of messages drained by one receiver in first-in, first-out order.

Program

Play the program to choose the second message and drain the mailbox into one summary.

mailbox_drain.rs
use std::collections::VecDeque;

fn main() {
    let second = ;
    let mut mailbox = VecDeque::new();
    mailbox.push_back("open");
    mailbox.push_back(second);
    let summary = drain(&mut mailbox);
    println!("{summary}");
}

fn drain(mailbox: &mut VecDeque<&str>) -> String {
    let mut seen = Vec::new();
    while let Some(message) = mailbox.pop_front() {
        seen.push(message);
    }
    seen.join(",")
}
use std::collections::VecDeque;

fn main() {
    let second = ;
    let mut mailbox = VecDeque::new();
    mailbox.push_back("open");
    mailbox.push_back(second);
    let summary = drain(&mut mailbox);
    println!("{summary}");
}

fn drain(mailbox: &mut VecDeque<&str>) -> String {
    let mut seen = Vec::new();
    while let Some(message) = mailbox.pop_front() {
        seen.push(message);
    }
    seen.join(",")
}
use std::collections::VecDeque;

fn main() {
    let second = ;
    let mut mailbox = VecDeque::new();
    mailbox.push_back("open");
    mailbox.push_back(second);
    let summary = drain(&mut mailbox);
    println!("{summary}");
}

fn drain(mailbox: &mut VecDeque<&str>) -> String {
    let mut seen = Vec::new();
    while let Some(message) = mailbox.pop_front() {
        seen.push(message);
    }
    seen.join(",")
}
mailbox `VecDeque` models a queue that can push at the back and pop from the front.
drain `while let Some(...)` keeps receiving until the mailbox is empty.
ordering `pop_front` preserves the order in which messages were queued.