qubit-fs 0.2.2

Provider-neutral synchronous and asynchronous filesystem abstraction for Rust
Documentation
// =============================================================================
//    Copyright (c) 2026 Haixing Hu.
//
//    SPDX-License-Identifier: Apache-2.0
//
//    Licensed under the Apache License, Version 2.0.
// =============================================================================
// facade.
//! Provider-opened asynchronous directory stream envelope.

use super::AsyncDirectoryStreamSession;
use crate::directory::AsyncDirectoryStream;
use crate::directory::ListOptions;
use crate::directory::ListScope;
use crate::metadata::FileSystemLimits;
use crate::path::PathSemantics;

/// An already-open asynchronous directory stream.
///
/// # Examples
///
/// ```rust
/// use qubit_fs::error::FsResult;
/// use qubit_fs::metadata::DirEntry;
/// use qubit_fs::spi::{AsyncDirectoryStreamSession, OpenedAsyncDirectoryStream, SpiFuture};
///
/// struct EmptyStream;
/// impl AsyncDirectoryStreamSession for EmptyStream {
///     fn next_entry_async(&mut self) -> SpiFuture<'_, FsResult<Option<DirEntry>>> {
///         Box::pin(async { Ok(None) })
///     }
/// }
/// let _stream = OpenedAsyncDirectoryStream::new(Box::new(EmptyStream));
/// ```
pub struct OpenedAsyncDirectoryStream {
    /// Provider enumeration session awaiting facade validation.
    session: Box<dyn AsyncDirectoryStreamSession>,
}

impl OpenedAsyncDirectoryStream {
    /// Wraps an opened provider directory-enumeration session.
    ///
    /// # Parameters
    /// - `session`: Provider enumeration session.
    ///
    /// # Returns
    /// An opened asynchronous stream envelope for facade validation.
    #[inline]
    #[must_use]
    pub fn new(session: Box<dyn AsyncDirectoryStreamSession>) -> Self {
        Self { session }
    }

    /// Transfers the stream into the facade handle.
    ///
    /// # Parameters
    /// - `root`: Validated directory root requested by the caller.
    /// - `options`: Validated listing behavior.
    /// - `provider`: Stable provider identifier used in generated errors.
    ///
    /// # Returns
    /// A facade-owned asynchronous directory stream.
    #[inline]
    pub(crate) fn into_stream(
        self,
        scope: ListScope,
        options: ListOptions,
        provider: &str,
        path_semantics: PathSemantics,
        limits: FileSystemLimits,
    ) -> crate::error::FsResult<AsyncDirectoryStream> {
        AsyncDirectoryStream::new(scope, self.session, options, provider, path_semantics, limits)
    }
}