65 lines · 2.7 KB · Rust
RawDownload
use std::collections::VecDeque; use git_object::bstr::{BStr, BString}; /// A trait to allow responding to a traversal designed to observe all entries in a tree, recursively while keeping track of/// paths if desired.pub trait Visit {    /// Sets the full path path in front of the queue so future calls to push and pop components affect it instead.    fn pop_front_tracked_path_and_set_current(&mut self);    /// Append a `component` to the end of a path, which may be empty.    fn push_back_tracked_path_component(&mut self, component: &BStr);    /// Append a `component` to the end of a path, which may be empty.    fn push_path_component(&mut self, component: &BStr);    /// Removes the last component from the path, which may leave it empty.    fn pop_path_component(&mut self);     /// Observe a tree entry that is a tree and return an instruction whether to continue or not.    /// [`Action::Skip`][visit::Action::Skip] can be used to prevent traversing it, for example if it's known to the caller already.    ///    /// The implementation may use the current path to learn where in the tree the change is located.    fn visit_tree(&mut self, entry: &git_object::tree::EntryRef<'_>) -> visit::Action;     /// Observe a tree entry that is NO tree and return an instruction whether to continue or not.    /// [`Action::Skip`][visit::Action::Skip] has no effect here.    ///    /// The implementation may use the current path to learn where in the tree the change is located.    fn visit_nontree(&mut self, entry: &git_object::tree::EntryRef<'_>) -> visit::Action;} /// A [Visit][Visit] implementation to record every observed change and keep track of the changed paths.#[derive(Clone, Debug, Default)]pub struct Recorder {    path_deque: VecDeque<BString>,    path: BString,    /// The observed entries.    pub records: Vec<recorder::Entry>,} ///pub mod visit {    /// What to do after an entry was [recorded][super::Visit::visit_tree()].    #[derive(Clone, Copy, PartialOrd, PartialEq, Ord, Eq, Hash)]    pub enum Action {        /// Continue the traversal of entries.        Continue,        /// Stop the traversal of entries, making this te last call to [`visit_(tree|nontree)(…)`][super::Visit::visit_nontree()].        Cancel,        /// Don't dive into the entry, skipping children effectively. Only useful in [`visit_tree(…)`][super::Visit::visit_tree()].        Skip,    }     impl Action {        /// Returns true if this action means to stop the traversal.        pub fn cancelled(&self) -> bool {            matches!(self, Action::Cancel)        }    }} ///pub mod recorder; ///pub mod breadthfirst;pub use breadthfirst::impl_::traverse as breadthfirst;