use super::CopyAttempt;
use super::CopyDeclineReason;
use super::CopyRequest;
use super::CreateDirectoryRequest;
use super::CreateTempDirectoryRequest;
use super::CreateTempFileRequest;
use super::DeleteDirectoryRequest;
use super::DeleteFileRequest;
use super::ListRequest;
use super::OpenReaderRequest;
use super::OpenWriterRequest;
use super::OpenedAsyncDirectoryStream;
use super::OpenedAsyncReader;
use super::OpenedAsyncTempDirectory;
use super::OpenedAsyncTempFile;
use super::OpenedAsyncWriter;
use super::ProviderProperties;
use super::RenameRequest;
use super::SpiCopyFailure;
use super::SpiFuture;
use super::SpiRenameFailure;
use super::StatRequest;
use super::StatResponse;
use crate::directory::CreateDirectoryOutcome;
use crate::directory::DeleteOutcome;
use crate::error::FsEffectState;
use crate::error::FsError;
use crate::error::FsErrorKind;
use crate::error::FsOperation;
use crate::error::FsResult;
use crate::rename::RenameFailureState;
use crate::rename::RenameOutcome;
pub trait AsyncFileSystemSpi: Send + Sync {
fn properties(&self) -> ProviderProperties;
fn stat<'a>(&'a self, request: StatRequest<'a>) -> SpiFuture<'a, FsResult<StatResponse>>;
fn list<'a>(&'a self, request: ListRequest<'a>) -> SpiFuture<'a, FsResult<OpenedAsyncDirectoryStream>> {
Box::pin(async move {
Err(match request.scope().path() {
Some(path) => unsupported(FsOperation::List, path),
None => FsError::new(
FsErrorKind::UnsupportedOperation,
FsOperation::List,
"provider operation is not supported",
),
})
})
}
fn open_reader<'a>(&'a self, request: OpenReaderRequest<'a>) -> SpiFuture<'a, FsResult<OpenedAsyncReader>> {
Box::pin(async move { Err(unsupported(FsOperation::OpenReader, request.path())) })
}
fn open_writer<'a>(&'a self, request: OpenWriterRequest<'a>) -> SpiFuture<'a, FsResult<OpenedAsyncWriter>> {
Box::pin(async move {
Err(unsupported(FsOperation::OpenWriter, request.path()).with_effect_state(FsEffectState::Unchanged))
})
}
fn create_directory<'a>(
&'a self,
request: CreateDirectoryRequest<'a>,
) -> SpiFuture<'a, FsResult<CreateDirectoryOutcome>> {
Box::pin(async move { Err(unsupported(FsOperation::CreateDir, request.path())) })
}
fn delete_file<'a>(&'a self, request: DeleteFileRequest<'a>) -> SpiFuture<'a, FsResult<DeleteOutcome>> {
Box::pin(async move { Err(unsupported(FsOperation::Delete, request.path())) })
}
fn delete_directory<'a>(&'a self, request: DeleteDirectoryRequest<'a>) -> SpiFuture<'a, FsResult<DeleteOutcome>> {
Box::pin(async move { Err(unsupported(FsOperation::Delete, request.path())) })
}
#[inline]
fn try_copy<'a>(&'a self, _request: CopyRequest<'a>) -> SpiFuture<'a, Result<CopyAttempt, SpiCopyFailure>> {
Box::pin(async { Ok(CopyAttempt::Declined(CopyDeclineReason::NotImplemented)) })
}
fn rename<'a>(&'a self, request: RenameRequest<'a>) -> SpiFuture<'a, Result<RenameOutcome, SpiRenameFailure>> {
Box::pin(async move {
Err(SpiRenameFailure::new(
unsupported(FsOperation::Rename, request.source()).with_target(request.target().clone()),
RenameFailureState::Unchanged,
))
})
}
fn create_temp_file<'a>(&'a self, _request: CreateTempFileRequest) -> SpiFuture<'a, FsResult<OpenedAsyncTempFile>> {
Box::pin(async {
Err(FsError::new(
FsErrorKind::UnsupportedOperation,
FsOperation::CreateTemp,
"provider does not implement this operation",
))
})
}
fn create_temp_directory<'a>(
&'a self,
_request: CreateTempDirectoryRequest,
) -> SpiFuture<'a, FsResult<OpenedAsyncTempDirectory>> {
Box::pin(async {
Err(FsError::new(
FsErrorKind::UnsupportedOperation,
FsOperation::CreateTemp,
"provider does not implement this operation",
))
})
}
}
fn unsupported(operation: FsOperation, path: &crate::path::Path) -> FsError {
FsError::new(
FsErrorKind::UnsupportedOperation,
operation,
"provider does not implement this operation",
)
.with_path(path.clone())
}