Struct opendal::operator_futures::OperatorFuture

source ·
pub struct OperatorFuture<I, O, F: Future<Output = Result<O>>> { /* private fields */ }
Expand description

OperatorFuture is the future generated by Operator.

The future will consume all the input to generate a future.

§NOTES

This struct is by design to keep in crate. We don’t want users to use this struct directly.

Implementations§

source§

impl<F: Future<Output = Result<Metadata>>> OperatorFuture<OpStat, Metadata, F>

source

pub fn if_match(self, v: &str) -> Self

Set the If-Match for this operation.

source

pub fn if_none_match(self, v: &str) -> Self

Set the If-None-Match for this operation.

source

pub fn if_modified_since(self, v: DateTime<Utc>) -> Self

Set the If-Modified-Since for this operation.

source

pub fn if_unmodified_since(self, v: DateTime<Utc>) -> Self

Set the If-Unmodified-Since for this operation.

source

pub fn version(self, v: &str) -> Self

Set the version for this operation.

source§

impl<F: Future<Output = Result<PresignedRequest>>> OperatorFuture<(OpStat, Duration), PresignedRequest, F>

source

pub fn override_content_disposition(self, v: &str) -> Self

Sets the content-disposition header that should be sent back by the remote read operation.

source

pub fn override_cache_control(self, v: &str) -> Self

Sets the cache-control header that should be sent back by the remote read operation.

source

pub fn override_content_type(self, v: &str) -> Self

Sets the content-type header that should be sent back by the remote read operation.

source

pub fn if_match(self, v: &str) -> Self

Set the If-Match of the option

source

pub fn if_none_match(self, v: &str) -> Self

Set the If-None-Match of the option

source§

impl<F: Future<Output = Result<PresignedRequest>>> OperatorFuture<(OpRead, Duration), PresignedRequest, F>

source

pub fn override_content_disposition(self, v: &str) -> Self

Sets the content-disposition header that should be sent back by the remote read operation.

source

pub fn override_cache_control(self, v: &str) -> Self

Sets the cache-control header that should be sent back by the remote read operation.

source

pub fn override_content_type(self, v: &str) -> Self

Sets the content-type header that should be sent back by the remote read operation.

source

pub fn if_match(self, v: &str) -> Self

Set the If-Match of the option

source

pub fn if_none_match(self, v: &str) -> Self

Set the If-None-Match of the option

source§

impl<F: Future<Output = Result<PresignedRequest>>> OperatorFuture<(OpWrite, Duration), PresignedRequest, F>

source

pub fn content_type(self, v: &str) -> Self

Set the content type of option

source

pub fn content_disposition(self, v: &str) -> Self

Set the content disposition of option

source

pub fn cache_control(self, v: &str) -> Self

Set the content type of option

source§

impl<F: Future<Output = Result<Buffer>>> OperatorFuture<(OpRead, OpReader), Buffer, F>

source

pub fn executor(self, executor: Executor) -> Self

Set the executor for this operation.

source

pub fn range(self, range: impl RangeBounds<u64>) -> Self

Set range for this read request.

If we have a file with size n.

  • .. means read bytes in range [0, n) of file.
  • 0..1024 and ..1024 means read bytes in range [0, 1024) of file
  • 1024.. means read bytes in range [1024, n) of file
let bs = op.read_with("path/to/file").range(0..1024).await?;
source

pub fn concurrent(self, concurrent: usize) -> Self

Set concurrent for the reader.

OpenDAL by default to write file without concurrent. This is not efficient for cases when users read large chunks of data. By setting concurrent, opendal will read files concurrently on support storage services.

By setting concurrent, opendal will fetch chunks concurrently with the given chunk size.

let r = op.read_with("path/to/file").concurrent(8).await?;
source

pub fn chunk(self, chunk_size: usize) -> Self

OpenDAL will use services’ preferred chunk size by default. Users can set chunk based on their own needs.

This following example will make opendal read data in 4MiB chunks:

let r = op.read_with("path/to/file").chunk(4 * 1024 * 1024).await?;
source

pub fn version(self, v: &str) -> Self

Set version for this read request.

This feature can be used to retrieve the data of a specified version of the given path.

If the version doesn’t exist, an error with kind ErrorKind::NotFound will be returned.


let mut bs = op.read_with("path/to/file").version(version).await?;
source

pub fn if_match(self, v: &str) -> Self

Set if_match for this read request.

This feature can be used to check if the file’s ETag matches the given ETag.

If file exists and it’s etag doesn’t match, an error with kind ErrorKind::ConditionNotMatch will be returned.

use opendal::Operator;
let mut metadata = op.read_with("path/to/file").if_match(etag).await?;
source

pub fn if_none_match(self, v: &str) -> Self

Set if_none_match for this read request.

This feature can be used to check if the file’s ETag doesn’t match the given ETag.

If file exists and it’s etag match, an error with kind ErrorKind::ConditionNotMatch will be returned.

use opendal::Operator;
let mut metadata = op.read_with("path/to/file").if_none_match(etag).await?;
source

pub fn if_modified_since(self, v: DateTime<Utc>) -> Self

§if_modified_since

Set if_modified_since for this read request.

This feature can be used to check if the file has been modified since the given timestamp.

If file exists and it hasn’t been modified since the specified time, an error with kind ErrorKind::ConditionNotMatch will be returned.

use opendal::Operator;
use chrono::DateTime;
use chrono::Utc;
let mut metadata = op.read_with("path/to/file").if_modified_since(time).await?;
source

pub fn if_unmodified_since(self, v: DateTime<Utc>) -> Self

Set if_unmodified_since for this read request.

This feature can be used to check if the file hasn’t been modified since the given timestamp.

If file exists and it has been modified since the specified time, an error with kind ErrorKind::ConditionNotMatch will be returned.

use opendal::Operator;
use chrono::DateTime;
use chrono::Utc;
let mut metadata = op.read_with("path/to/file").if_unmodified_since(time).await?;
source§

impl<F: Future<Output = Result<Reader>>> OperatorFuture<(OpRead, OpReader), Reader, F>

source

pub fn version(self, v: &str) -> Self

Set version for this reader.

This feature can be used to retrieve the data of a specified version of the given path.

If the version doesn’t exist, an error with kind ErrorKind::NotFound will be returned.


let mut r = op.reader_with("path/to/file").version(version).await?;
source

pub fn concurrent(self, concurrent: usize) -> Self

Set concurrent for the reader.

OpenDAL by default to write file without concurrent. This is not efficient for cases when users read large chunks of data. By setting concurrent, opendal will reading files concurrently on support storage services.

By setting concurrent, opendal will fetch chunks concurrently with the give chunk size.

let r = op.reader_with("path/to/file").concurrent(8).await?;
source

pub fn chunk(self, chunk_size: usize) -> Self

OpenDAL will use services’ preferred chunk size by default. Users can set chunk based on their own needs.

This following example will make opendal read data in 4MiB chunks:

let r = op
    .reader_with("path/to/file")
    .chunk(4 * 1024 * 1024)
    .await?;
source

pub fn gap(self, gap_size: usize) -> Self

Controls the optimization strategy for range reads in Reader::fetch.

When performing range reads, if the gap between two requested ranges is smaller than the configured gap size, OpenDAL will merge these ranges into a single read request and discard the unrequested data in between. This helps reduce the number of API calls to remote storage services.

This optimization is particularly useful when performing multiple small range reads that are close to each other, as it reduces the overhead of multiple network requests at the cost of transferring some additional data.

In this example, if two requested ranges are separated by less than 1MiB, they will be merged into a single read request:

let r = op
    .reader_with("path/to/file")
    .chunk(4 * 1024 * 1024)
    .gap(1024 * 1024)  // 1MiB gap
    .await?;
source

pub fn if_match(self, etag: &str) -> Self

Set if-match for this read request.

This feature can be used to check if the file’s ETag matches the given ETag.

If file exists and it’s etag doesn’t match, an error with kind ErrorKind::ConditionNotMatch will be returned.

use opendal::Operator;
let mut r = op.reader_with("path/to/file").if_match(etag).await?;
source

pub fn if_none_match(self, etag: &str) -> Self

Set if-none-match for this read request.

This feature can be used to check if the file’s ETag doesn’t match the given ETag.

If file exists and it’s etag match, an error with kind ErrorKind::ConditionNotMatch will be returned.

use opendal::Operator;
let mut r = op.reader_with("path/to/file").if_none_match(etag).await?;
source

pub fn if_modified_since(self, v: DateTime<Utc>) -> Self

Set if-modified-since for this read request.

This feature can be used to check if the file has been modified since the given timestamp.

If file exists and it hasn’t been modified since the specified time, an error with kind ErrorKind::ConditionNotMatch will be returned.

use opendal::Operator;
use chrono::DateTime;
use chrono::Utc;
let mut r = op.reader_with("path/to/file").if_modified_since(time).await?;
source

pub fn if_unmodified_since(self, v: DateTime<Utc>) -> Self

Set if-unmodified-since for this read request.

This feature can be used to check if the file hasn’t been modified since the given timestamp.

If file exists and it has been modified since the specified time, an error with kind ErrorKind::ConditionNotMatch will be returned.

use opendal::Operator;
use chrono::DateTime;
use chrono::Utc;
let mut r = op.reader_with("path/to/file").if_unmodified_since(time).await?;
source§

impl<F: Future<Output = Result<()>>> OperatorFuture<(OpWrite, OpWriter, Buffer), (), F>

source

pub fn executor(self, executor: Executor) -> Self

Set the executor for this operation.

source

pub fn append(self, v: bool) -> Self

Sets append mode for this write request.

§Capability

Check Capability::write_can_append before using this feature.

§Behavior
  • By default, write operations overwrite existing files
  • When append is set to true:
    • New data will be appended to the end of existing file
    • If file doesn’t exist, it will be created
  • If not supported, will return an error

This operation allows adding data to existing files instead of overwriting them.

§Example
use bytes::Bytes;

let _ = op.write_with("path/to/file", vec![0; 4096]).append(true).await?;
source

pub fn chunk(self, v: usize) -> Self

Sets chunk size for buffered writes.

§Capability

Check Capability::write_multi_min_size and Capability::write_multi_max_size for size limits.

§Behavior
  • By default, OpenDAL sets optimal chunk size based on service capabilities
  • When chunk size is set:
    • Data will be buffered until reaching chunk size
    • One API call will be made per chunk
    • Last chunk may be smaller than chunk size
  • Important considerations:
    • Some services require minimum chunk sizes (e.g. S3’s EntityTooSmall error)
    • Smaller chunks increase API calls and costs
    • Larger chunks increase memory usage, but improve performance and reduce costs
§Performance Impact

Setting appropriate chunk size can:

  • Reduce number of API calls
  • Improve overall throughput
  • Lower operation costs
  • Better utilize network bandwidth
§Example
use bytes::Bytes;

// Set 8MiB chunk size - data will be sent in one API call at close
let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .chunk(8 * 1024 * 1024)
    .await?;
source

pub fn concurrent(self, v: usize) -> Self

Sets concurrent write operations for this writer.

§Behavior
  • By default, OpenDAL writes files sequentially
  • When concurrent is set:
    • Multiple write operations can execute in parallel
    • Write operations return immediately without waiting if tasks space are available
    • Close operation ensures all writes complete in order
    • Memory usage increases with concurrency level
  • If not supported, falls back to sequential writes

This feature significantly improves performance when:

  • Writing large files
  • Network latency is high
  • Storage service supports concurrent uploads like multipart uploads
§Performance Impact

Setting appropriate concurrency can:

  • Increase write throughput
  • Reduce total write time
  • Better utilize available bandwidth
  • Trade memory for performance
§Example
use bytes::Bytes;

// Enable concurrent writes with 8 parallel operations at 128B chunk.
let _ = op.write_with("path/to/file", vec![0; 4096]).chunk(128).concurrent(8).await?;
source

pub fn cache_control(self, v: &str) -> Self

Sets Cache-Control header for this write operation.

§Capability

Check Capability::write_with_cache_control before using this feature.

§Behavior
  • If supported, sets Cache-Control as system metadata on the target file
  • The value should follow HTTP Cache-Control header format
  • If not supported, the value will be ignored

This operation allows controlling caching behavior for the written content.

§Use Cases
  • Setting browser cache duration
  • Configuring CDN behavior
  • Optimizing content delivery
  • Managing cache invalidation
§Example
use bytes::Bytes;

// Cache content for 7 days (604800 seconds)
let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .cache_control("max-age=604800")
    .await?;
§References
source

pub fn content_type(self, v: &str) -> Self

Sets Content-Type header for this write operation.

§Capability

Check Capability::write_with_content_type before using this feature.

§Behavior
  • If supported, sets Content-Type as system metadata on the target file
  • The value should follow MIME type format (e.g. “text/plain”, “image/jpeg”)
  • If not supported, the value will be ignored

This operation allows specifying the media type of the content being written.

§Example
use bytes::Bytes;

// Set content type for plain text file
let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .content_type("text/plain")
    .await?;
source

pub fn content_disposition(self, v: &str) -> Self

§content_disposition

Sets Content-Disposition header for this write request.

§Capability

Check Capability::write_with_content_disposition before using this feature.

§Behavior
  • If supported, sets Content-Disposition as system metadata on the target file
  • The value should follow HTTP Content-Disposition header format
  • Common values include:
    • inline - Content displayed within browser
    • attachment - Content downloaded as file
    • attachment; filename="example.jpg" - Downloaded with specified filename
  • If not supported, the value will be ignored

This operation allows controlling how the content should be displayed or downloaded.

§Example
use bytes::Bytes;

let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .content_disposition("attachment; filename=\"filename.jpg\"")
    .await?;
source

pub fn content_encoding(self, v: &str) -> Self

Sets Content-Encoding header for this write request.

§Capability

Check Capability::write_with_content_encoding before using this feature.

§Behavior
  • If supported, sets Content-Encoding as system metadata on the target file
  • The value should follow HTTP Content-Encoding header format
  • Common values include:
    • gzip - Content encoded using gzip compression
    • deflate - Content encoded using deflate compression
    • br - Content encoded using Brotli compression
    • identity - No encoding applied (default value)
  • If not supported, the value will be ignored

This operation allows specifying the encoding applied to the content being written.

§Example
use bytes::Bytes;

let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .content_encoding("gzip")
    .await?;
source

pub fn if_match(self, s: &str) -> Self

Sets If-Match header for this write request.

§Capability

Check Capability::write_with_if_match before using this feature.

§Behavior
  • If supported, the write operation will only succeed if the target’s ETag matches the specified value
  • The value should be a valid ETag string
  • Common values include:
    • A specific ETag value like "686897696a7c876b7e"
    • * - Matches any existing resource
  • If not supported, the value will be ignored

This operation provides conditional write functionality based on ETag matching, helping prevent unintended overwrites in concurrent scenarios.

§Example
use bytes::Bytes;

let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .if_match("\"686897696a7c876b7e\"")
    .await?;
source

pub fn if_none_match(self, s: &str) -> Self

Sets If-None-Match header for this write request.

Note: Certain services, like s3, support if_not_exists but not if_none_match. Use if_not_exists if you only want to check whether a file exists.

§Capability

Check Capability::write_with_if_none_match before using this feature.

§Behavior
  • If supported, the write operation will only succeed if the target’s ETag does not match the specified value
  • The value should be a valid ETag string
  • Common values include:
    • A specific ETag value like "686897696a7c876b7e"
    • * - Matches if the resource does not exist
  • If not supported, the value will be ignored

This operation provides conditional write functionality based on ETag non-matching, useful for preventing overwriting existing resources or ensuring unique writes.

§Example
use bytes::Bytes;

let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .if_none_match("\"686897696a7c876b7e\"")
    .await?;
source

pub fn if_not_exists(self, b: bool) -> Self

Sets the condition that write operation will succeed only if target does not exist.

§Capability

Check Capability::write_with_if_not_exists before using this feature.

§Behavior
  • If supported, the write operation will only succeed if the target path does not exist
  • Will return error if target already exists
  • If not supported, the value will be ignored

This operation provides a way to ensure write operations only create new resources without overwriting existing ones, useful for implementing “create if not exists” logic.

§Example
use bytes::Bytes;

let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .if_not_exists(true)
    .await?;
source

pub fn user_metadata( self, data: impl IntoIterator<Item = (String, String)>, ) -> Self

Sets user metadata for this write request.

§Capability

Check Capability::write_with_user_metadata before using this feature.

§Behavior
  • If supported, the user metadata will be attached to the object during write
  • Accepts key-value pairs where both key and value are strings
  • Keys are case-insensitive in most services
  • Services may have limitations for user metadata, for example:
    • Key length is typically limited (e.g., 1024 bytes)
    • Value length is typically limited (e.g., 4096 bytes)
    • Total metadata size might be limited
    • Some characters might be forbidden in keys
  • If not supported, the metadata will be ignored

User metadata provides a way to attach custom metadata to objects during write operations. This metadata can be retrieved later when reading the object.

§Example
use bytes::Bytes;

let _ = op
    .write_with("path/to/file", vec![0; 4096])
    .user_metadata([
        ("language".to_string(), "rust".to_string()),
        ("author".to_string(), "OpenDAL".to_string()),
    ])
    .await?;
source§

impl<F: Future<Output = Result<Writer>>> OperatorFuture<(OpWrite, OpWriter), Writer, F>

source

pub fn executor(self, executor: Executor) -> Self

Set the executor for this operation.

source

pub fn append(self, v: bool) -> Self

Sets append mode for this write request.

§Capability

Check Capability::write_can_append before using this feature.

§Behavior
  • By default, write operations overwrite existing files
  • When append is set to true:
    • New data will be appended to the end of existing file
    • If file doesn’t exist, it will be created
  • If not supported, will return an error

This operation allows adding data to existing files instead of overwriting them.

§Example
use bytes::Bytes;

let mut w = op.writer_with("path/to/file").append(true).await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
source

pub fn chunk(self, v: usize) -> Self

Sets chunk size for buffered writes.

§Capability

Check Capability::write_multi_min_size and Capability::write_multi_max_size for size limits.

§Behavior
  • By default, OpenDAL sets optimal chunk size based on service capabilities
  • When chunk size is set:
    • Data will be buffered until reaching chunk size
    • One API call will be made per chunk
    • Last chunk may be smaller than chunk size
  • Important considerations:
    • Some services require minimum chunk sizes (e.g. S3’s EntityTooSmall error)
    • Smaller chunks increase API calls and costs
    • Larger chunks increase memory usage, but improve performance and reduce costs
§Performance Impact

Setting appropriate chunk size can:

  • Reduce number of API calls
  • Improve overall throughput
  • Lower operation costs
  • Better utilize network bandwidth
§Example
use bytes::Bytes;

// Set 8MiB chunk size - data will be sent in one API call at close
let mut w = op
    .writer_with("path/to/file")
    .chunk(8 * 1024 * 1024)
    .await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
source

pub fn concurrent(self, v: usize) -> Self

Sets concurrent write operations for this writer.

§Behavior
  • By default, OpenDAL writes files sequentially
  • When concurrent is set:
    • Multiple write operations can execute in parallel
    • Write operations return immediately without waiting if tasks space are available
    • Close operation ensures all writes complete in order
    • Memory usage increases with concurrency level
  • If not supported, falls back to sequential writes

This feature significantly improves performance when:

  • Writing large files
  • Network latency is high
  • Storage service supports concurrent uploads like multipart uploads
§Performance Impact

Setting appropriate concurrency can:

  • Increase write throughput
  • Reduce total write time
  • Better utilize available bandwidth
  • Trade memory for performance
§Example
use bytes::Bytes;

// Enable concurrent writes with 8 parallel operations
let mut w = op.writer_with("path/to/file").concurrent(8).await?;

// First write starts immediately
w.write(vec![0; 4096]).await?;

// Second write runs concurrently with first
w.write(vec![1; 4096]).await?;

// Ensures all writes complete successfully and in order
w.close().await?;
source

pub fn cache_control(self, v: &str) -> Self

Sets Cache-Control header for this write operation.

§Capability

Check Capability::write_with_cache_control before using this feature.

§Behavior
  • If supported, sets Cache-Control as system metadata on the target file
  • The value should follow HTTP Cache-Control header format
  • If not supported, the value will be ignored

This operation allows controlling caching behavior for the written content.

§Use Cases
  • Setting browser cache duration
  • Configuring CDN behavior
  • Optimizing content delivery
  • Managing cache invalidation
§Example
use bytes::Bytes;

// Cache content for 7 days (604800 seconds)
let mut w = op
    .writer_with("path/to/file")
    .cache_control("max-age=604800")
    .await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
§References
source

pub fn content_type(self, v: &str) -> Self

Sets Content-Type header for this write operation.

§Capability

Check Capability::write_with_content_type before using this feature.

§Behavior
  • If supported, sets Content-Type as system metadata on the target file
  • The value should follow MIME type format (e.g. “text/plain”, “image/jpeg”)
  • If not supported, the value will be ignored

This operation allows specifying the media type of the content being written.

§Example
use bytes::Bytes;

// Set content type for plain text file
let mut w = op
    .writer_with("path/to/file")
    .content_type("text/plain")
    .await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
source

pub fn content_disposition(self, v: &str) -> Self

§content_disposition

Sets Content-Disposition header for this write request.

§Capability

Check Capability::write_with_content_disposition before using this feature.

§Behavior
  • If supported, sets Content-Disposition as system metadata on the target file
  • The value should follow HTTP Content-Disposition header format
  • Common values include:
    • inline - Content displayed within browser
    • attachment - Content downloaded as file
    • attachment; filename="example.jpg" - Downloaded with specified filename
  • If not supported, the value will be ignored

This operation allows controlling how the content should be displayed or downloaded.

§Example
use bytes::Bytes;

let mut w = op
    .writer_with("path/to/file")
    .content_disposition("attachment; filename=\"filename.jpg\"")
    .await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
source

pub fn content_encoding(self, v: &str) -> Self

Sets Content-Encoding header for this write request.

§Capability

Check Capability::write_with_content_encoding before using this feature.

§Behavior
  • If supported, sets Content-Encoding as system metadata on the target file
  • The value should follow HTTP Content-Encoding header format
  • Common values include:
    • gzip - Content encoded using gzip compression
    • deflate - Content encoded using deflate compression
    • br - Content encoded using Brotli compression
    • identity - No encoding applied (default value)
  • If not supported, the value will be ignored

This operation allows specifying the encoding applied to the content being written.

§Example
use bytes::Bytes;

let mut w = op
    .writer_with("path/to/file")
    .content_encoding("gzip")
    .await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
source

pub fn if_match(self, s: &str) -> Self

Sets If-Match header for this write request.

§Capability

Check Capability::write_with_if_match before using this feature.

§Behavior
  • If supported, the write operation will only succeed if the target’s ETag matches the specified value
  • The value should be a valid ETag string
  • Common values include:
    • A specific ETag value like "686897696a7c876b7e"
    • * - Matches any existing resource
  • If not supported, the value will be ignored

This operation provides conditional write functionality based on ETag matching, helping prevent unintended overwrites in concurrent scenarios.

§Example
use bytes::Bytes;

let mut w = op
    .writer_with("path/to/file")
    .if_match("\"686897696a7c876b7e\"")
    .await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
source

pub fn if_none_match(self, s: &str) -> Self

Sets If-None-Match header for this write request.

Note: Certain services, like s3, support if_not_exists but not if_none_match. Use if_not_exists if you only want to check whether a file exists.

§Capability

Check Capability::write_with_if_none_match before using this feature.

§Behavior
  • If supported, the write operation will only succeed if the target’s ETag does not match the specified value
  • The value should be a valid ETag string
  • Common values include:
    • A specific ETag value like "686897696a7c876b7e"
    • * - Matches if the resource does not exist
  • If not supported, the value will be ignored

This operation provides conditional write functionality based on ETag non-matching, useful for preventing overwriting existing resources or ensuring unique writes.

§Example
use bytes::Bytes;

let mut w = op
    .writer_with("path/to/file")
    .if_none_match("\"686897696a7c876b7e\"")
    .await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
source

pub fn if_not_exists(self, b: bool) -> Self

Sets the condition that write operation will succeed only if target does not exist.

§Capability

Check Capability::write_with_if_not_exists before using this feature.

§Behavior
  • If supported, the write operation will only succeed if the target path does not exist
  • Will return error if target already exists
  • If not supported, the value will be ignored

This operation provides a way to ensure write operations only create new resources without overwriting existing ones, useful for implementing “create if not exists” logic.

§Example
use bytes::Bytes;

let mut w = op
    .writer_with("path/to/file")
    .if_not_exists(true)
    .await?;
w.write(vec![0; 4096]).await?;
w.write(vec![1; 4096]).await?;
w.close().await?;
source

pub fn user_metadata( self, data: impl IntoIterator<Item = (String, String)>, ) -> Self

Sets user metadata for this write request.

§Capability

Check Capability::write_with_user_metadata before using this feature.

§Behavior
  • If supported, the user metadata will be attached to the object during write
  • Accepts key-value pairs where both key and value are strings
  • Keys are case-insensitive in most services
  • Services may have limitations for user metadata, for example:
    • Key length is typically limited (e.g., 1024 bytes)
    • Value length is typically limited (e.g., 4096 bytes)
    • Total metadata size might be limited
    • Some characters might be forbidden in keys
  • If not supported, the metadata will be ignored

User metadata provides a way to attach custom metadata to objects during write operations. This metadata can be retrieved later when reading the object.

§Example
use bytes::Bytes;

let mut w = op
    .writer_with("path/to/file")
    .user_metadata([
        ("content-type".to_string(), "text/plain".to_string()),
        ("author".to_string(), "OpenDAL".to_string()),
    ])
    .await?;
w.write(vec![0; 4096]).await?;
w.close().await?;
source§

impl<F: Future<Output = Result<()>>> OperatorFuture<OpDelete, (), F>

source

pub fn version(self, v: &str) -> Self

Change the version of this delete operation.

source§

impl<F: Future<Output = Result<Vec<Entry>>>> OperatorFuture<OpList, Vec<Entry>, F>

source

pub fn limit(self, v: usize) -> Self

The limit passed to underlying service to specify the max results that could return per-request.

Users could use this to control the memory usage of list operation.

source

pub fn start_after(self, v: &str) -> Self

The start_after passes to underlying service to specify the specified key to start listing from.

source

pub fn recursive(self, v: bool) -> Self

The recursive is used to control whether the list operation is recursive.

  • If false, list operation will only list the entries under the given path.
  • If true, list operation will list all entries that starts with given path.

Default to false.

source

pub fn version(self, v: bool) -> Self

👎Deprecated since 0.51.1: use versions instead

The version is used to control whether the object versions should be returned.

  • If false, list operation will not return with object versions
  • If true, list operation will return with object versions if object versioning is supported by the underlying service

Default to false

source

pub fn versions(self, v: bool) -> Self

Controls whether the list operation should return file versions.

This function allows you to specify if the list operation, when executed, should include information about different versions of files, if versioning is supported and enabled.

If true, subsequent list operations will include version information for each file. If false, version information will be omitted from the list results.

Default to false

source

pub fn deleted(self, v: bool) -> Self

Controls whether the list operation should include deleted files (or versions).

This function allows you to specify if the list operation, when executed, should include entries for files or versions that have been marked as deleted. This is particularly relevant in object storage systems that support soft deletion or versioning.

If true, subsequent list operations will include deleted files or versions. If false, deleted files or versions will be excluded from the list results.

source§

impl<F: Future<Output = Result<Lister>>> OperatorFuture<OpList, Lister, F>

source

pub fn limit(self, v: usize) -> Self

The limit passed to underlying service to specify the max results that could return per-request.

Users could use this to control the memory usage of list operation.

source

pub fn start_after(self, v: &str) -> Self

The start_after passes to underlying service to specify the specified key to start listing from.

source

pub fn recursive(self, v: bool) -> Self

The recursive is used to control whether the list operation is recursive.

  • If false, list operation will only list the entries under the given path.
  • If true, list operation will list all entries that starts with given path.

Default to false.

source

pub fn version(self, v: bool) -> Self

👎Deprecated since 0.51.1: use versions instead

The version is used to control whether the object versions should be returned.

  • If false, list operation will not return with object versions
  • If true, list operation will return with object versions if object versioning is supported by the underlying service

Default to false

source

pub fn versions(self, v: bool) -> Self

Controls whether the list operation should return file versions.

This function allows you to specify if the list operation, when executed, should include information about different versions of files, if versioning is supported and enabled.

If true, subsequent list operations will include version information for each file. If false, version information will be omitted from the list results.

Default to false

source

pub fn deleted(self, v: bool) -> Self

Controls whether the list operation should include deleted files (or versions).

This function allows you to specify if the list operation, when executed, should include entries for files or versions that have been marked as deleted. This is particularly relevant in object storage systems that support soft deletion or versioning.

If true, subsequent list operations will include deleted files or versions. If false, deleted files or versions will be excluded from the list results.

Trait Implementations§

source§

impl<I, O, F> IntoFuture for OperatorFuture<I, O, F>
where F: Future<Output = Result<O>>,

§

type Output = Result<O, Error>

The output that the future will produce on completion.
§

type IntoFuture = F

Which kind of future are we turning this into?
source§

fn into_future(self) -> Self::IntoFuture

Creates a future from a value. Read more

Auto Trait Implementations§

§

impl<I, O, F> Freeze for OperatorFuture<I, O, F>
where I: Freeze,

§

impl<I, O, F> !RefUnwindSafe for OperatorFuture<I, O, F>

§

impl<I, O, F> Send for OperatorFuture<I, O, F>
where I: Send,

§

impl<I, O, F> Sync for OperatorFuture<I, O, F>
where I: Sync,

§

impl<I, O, F> Unpin for OperatorFuture<I, O, F>
where I: Unpin,

§

impl<I, O, F> !UnwindSafe for OperatorFuture<I, O, F>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CompatExt for T

§

fn compat(self) -> Compat<T>

Applies the [Compat] adapter by value. Read more
§

fn compat_ref(&self) -> Compat<&T>

Applies the [Compat] adapter by shared reference. Read more
§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the [Compat] adapter by mutable reference. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<T> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
source§

impl<T> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<G1, G2> Within<G2> for G1
where G2: Contains<G1>,

§

fn is_within(&self, b: &G2) -> bool

§

impl<T> ErasedDestructor for T
where T: 'static,

source§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSendSync for T