use std::path::Path; #[cfg(feature = "git")] pub use git::Git; #[cfg(not(feature = "git"))] pub use Dummy as Git; #[cfg(feature = "git")] mod git; mod diff; pub use diff::{DiffHandle, Hunk}; pub trait DiffProvider { /// Returns the data that a diff should be computed against /// if this provider is used. /// The data is returned as raw byte without any decoding or encoding performed /// to ensure all file encodings are handled correctly. fn get_diff_base(&self, file: &Path) -> Option>; } #[doc(hidden)] pub struct Dummy; impl DiffProvider for Dummy { fn get_diff_base(&self, _file: &Path) -> Option> { None } } pub struct DiffProviderRegistry { providers: Vec>, } impl DiffProviderRegistry { pub fn get_diff_base(&self, file: &Path) -> Option> { self.providers .iter() .find_map(|provider| provider.get_diff_base(file)) } } impl Default for DiffProviderRegistry { fn default() -> Self { // currently only git is supported // TODO make this configurable when more providers are added let git: Box = Box::new(Git); let providers = vec![git]; DiffProviderRegistry { providers } } }