fn make_grist() -> String {
    let mut rng = rand::thread_rng();
    std::iter::from_fn(move || {
        let byte = b"ghjklmnpqrstuvwxyz"
            .choose(&mut rng)
            .expect("slice is not empty");
        Some(char::from(*byte))
    })
    .take(6)
    .join("")
}
// TODO - make this a util, we should use this grist in a few other places too
make this a util, we should use this grist in a few other places too
make this a util we should use this grist in a few other places too
fn make_grist() -> String {
    let mut rng = rand::thread_rng();
    std::iter::from_fn(move || {
        let byte = b"ghjklmnpqrstuvwxyz"
            .choose(&mut rng)
            .expect("slice is not empty");
        Some(char::from(*byte))
    })
    .take(6)
    .join("")
}
fn make_grist ( ) -> String { let mut rng = rand :: thread_rng ( ) ; std :: iter :: from_fn ( move | | { let byte = b" " . choose ( & mut rng ) . expect ( " " ) ; Some ( char :: from ( * byte ) ) } ) . take ( 6 ) . join ( " " ) }
TODO - make this a util, we should use this grist in a few other places too
TODO - make this a util we should use this grist in a few other places too