Skip to main content

qubit_fs/copy/
copy_assessment.rs

1// =============================================================================
2//    Copyright (c) 2026 Haixing Hu.
3//
4//    SPDX-License-Identifier: Apache-2.0
5// =============================================================================
6
7//! Static copy execution assessment.
8
9use super::CopyExecutionRoute;
10use super::FallbackRejection;
11
12/// Result of no-I/O copy route analysis.
13///
14/// The assessment is derived from the cached provider snapshot and does not
15/// contact the provider. Execution may still fail after this assessment.
16///
17/// # Examples
18///
19/// ```rust
20/// # fn main() -> Result<(), qubit_fs::FsError> {
21/// use qubit_fs::Path;
22/// use qubit_fs::copy::CopyExecutionRoute;
23/// use qubit_fs::copy::CopyOptions;
24/// # mod support { include!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/common/rustdoc_support.rs")); }
25/// let fs = support::rustdoc_provider::filesystem();
26/// let assessment = fs.assess_copy(&Path::parse("/report")?, &Path::parse("/copy")?, &CopyOptions::default())?;
27/// assert_eq!(assessment.route(), CopyExecutionRoute::StreamOnly);
28/// assert_eq!(assessment.fallback_rejection(), None);
29/// # Ok(())
30/// # }
31/// ```
32#[derive(Clone, Copy, Debug, Eq, PartialEq)]
33pub struct CopyAssessment {
34    route: CopyExecutionRoute,
35    fallback_rejection: Option<FallbackRejection>,
36}
37
38impl CopyAssessment {
39    /// Creates an assessment inside the facade.
40    #[inline]
41    pub(crate) const fn new(route: CopyExecutionRoute, fallback_rejection: Option<FallbackRejection>) -> Self {
42        Self {
43            route,
44            fallback_rejection,
45        }
46    }
47
48    /// Returns the possible execution route.
49    #[inline]
50    #[must_use]
51    pub const fn route(self) -> CopyExecutionRoute {
52        self.route
53    }
54
55    /// Returns the first static fallback rejection, if any.
56    #[inline]
57    #[must_use]
58    pub const fn fallback_rejection(self) -> Option<FallbackRejection> {
59        self.fallback_rejection
60    }
61}