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}