use std::fmt::Debug;
use std::fmt::Formatter;
use std::fmt::Result as FmtResult;
use std::time::Instant;
use crate::directory::DirectoryStreamState;
use crate::directory::ListOptions;
use crate::directory::ListScope;
use crate::directory::internal::ListStreamPolicy;
use crate::error::FsResult;
use crate::metadata::DirEntry;
use crate::metadata::FileSystemLimits;
use crate::spi::DirectoryStreamSpi;
pub struct DirectoryStream {
session: Box<dyn DirectoryStreamSpi>,
policy: ListStreamPolicy,
}
impl DirectoryStream {
#[inline]
pub(crate) fn new(
scope: ListScope,
session: Box<dyn DirectoryStreamSpi>,
options: ListOptions,
provider: &str,
path_semantics: crate::path::PathSemantics,
limits: FileSystemLimits,
) -> FsResult<Self> {
let policy = ListStreamPolicy::new(scope, options, provider, path_semantics, limits, Instant::now())?;
Ok(Self { session, policy })
}
#[inline]
#[must_use = "inspect the stream lifecycle state"]
pub const fn state(&self) -> DirectoryStreamState {
self.policy.state()
}
#[inline]
pub fn next_entry(&mut self) -> FsResult<Option<DirEntry>> {
self.policy.before_next(Instant::now())?;
let result = self.session.next_entry();
self.policy.finish_next(result, Instant::now())
}
}
impl Debug for DirectoryStream {
#[inline]
fn fmt(&self, formatter: &mut Formatter<'_>) -> FmtResult {
formatter.debug_struct("DirectoryStream").finish_non_exhaustive()
}
}