• [^] # Re: walkdir, la place est dans la bibliothèque standard ?

    Posté par (site web personnel, Mastodon) . En réponse au journal Mon inquiétude sur les dépendances en Rust. Évalué à 3. Dernière modification le 02 juillet 2024 à 15:08.

    Il y a une issue pour ça : https://github.com/rust-lang/rust/issues/69684

    Le souci, c'est que les cas simples (comme le mien) sont faciles à implémenter, mais fournir une API qui couvre à peu près bien tous les cas intéressants est beaucoup, beaucoup plus compliqué. Il faut notamment penser à : ce qui se passe quand on rencontre un symlink vers un dossier, ce qui se passe quand on n'a pas les permissions, proposer une manière de limiter la profondeur de recherche, ou de filtrer des dossiers au fur et à mesure qu'ils sont lus (pour éviter de descendre dedans), etc. Donc je peux comprendre que ce soit trop pour la stdlib, même si ça se discute.

    Je suppose que dans les 50 lignes produites par l'auteur, il y a plus que ça.

    Non, il n'y a vraiment rien de plus que la base de la base (OK, 40 lignes, pas 50) :

    useanyhow::Result;
    struct WalkDir{
    stack: Vec<std::fs::ReadDir>,
    }
    implWalkDir{
    fn new(dir: &Path)-> Result<Self>{
    Ok(Self{stack: vec![std::fs::read_dir(dir)?]})
    }
    }
    implIteratorforWalkDir{
    type Item=Result<std::fs::DirEntry>;
    fn next(&mutself)-> Option<Self::Item>{
    macro_rules!iter_try{
    ($expr:expr)=>{
    match$expr{
    Ok(x)=>x,
    Err(e)=>returnSome(Err(e.into())),
    }
    }
    }
    loop{
    letSome(top)=self.stack.last_mut()else{
    returnNone;
    };
    letSome(next)=top.next()else{
    self.stack.pop();
    continue;
    };
    letnext=iter_try!(next);
    ifiter_try!(next.file_type()).is_dir(){
    self.stack.push(iter_try!(std::fs::read_dir(next.path())));
    }else{
    returnSome(Ok(next));
    }
    }
    }
    }

    C'est juste que les itérateurs sont un poil verbeux, mais rien de très notable.