use crate::Language;
#[cfg(feature = "directory")]
pub use directory::Directory;
#[cfg(feature = "git")]
pub use git::Git;
use std::marker::{Send, Sync};
use std::path::Path;
#[cfg(feature = "directory")]
mod directory;
#[cfg(feature = "git")]
mod git;
pub trait FileSource<'files>: Sync {
type Filepath: AsRef<Path>;
type Contents: AsRef<[u8]>;
type Entry: Send;
type State: Send + Clone;
type Iter: Iterator<Item = Self::Entry> + Send;
fn entries(&'files self) -> crate::Result<Self::Iter>;
fn filepath(
&'files self,
entry: &Self::Entry,
state: &mut Self::State,
) -> crate::Result<Self::Filepath>;
fn contents(
&'files self,
entry: &Self::Entry,
state: &mut Self::State,
) -> crate::Result<Self::Contents>;
fn state(&'files self) -> crate::Result<Self::State>;
fn overrides(&self, path: impl AsRef<Path>, state: &mut Self::State) -> Overrides {
Overrides {
language: self.language_override(&path, state),
is_documentation: self.is_documentation_override(&path, state),
is_generated: self.is_generated_override(&path, state),
is_vendored: self.is_vendored_override(&path, state),
is_detectable: self.is_detectable_override(&path, state),
}
}
fn language_override(
&self,
_path: impl AsRef<Path>,
_state: &mut Self::State,
) -> Option<Language> {
None
}
fn is_documentation_override(
&self,
_path: impl AsRef<Path>,
_state: &mut Self::State,
) -> Option<bool> {
None
}
fn is_generated_override(
&self,
_path: impl AsRef<Path>,
_state: &mut Self::State,
) -> Option<bool> {
None
}
fn is_vendored_override(
&self,
_path: impl AsRef<Path>,
_state: &mut Self::State,
) -> Option<bool> {
None
}
fn is_detectable_override(
&self,
_path: impl AsRef<Path>,
_state: &mut Self::State,
) -> Option<bool> {
None
}
}
#[non_exhaustive]
#[derive(Default)]
pub struct Overrides {
pub language: Option<Language>,
pub is_documentation: Option<bool>,
pub is_generated: Option<bool>,
pub is_vendored: Option<bool>,
pub is_detectable: Option<bool>,
}