Struct opendal::operator_futures::OperatorFuture
source · pub struct OperatorFuture<I, O, F: Future<Output = Result<O>>> { /* private fields */ }
Expand description
Implementations§
source§impl<F: Future<Output = Result<Metadata>>> OperatorFuture<OpStat, Metadata, F>
impl<F: Future<Output = Result<Metadata>>> OperatorFuture<OpStat, Metadata, F>
sourcepub fn if_none_match(self, v: &str) -> Self
pub fn if_none_match(self, v: &str) -> Self
Set the If-None-Match for this operation.
sourcepub fn if_modified_since(self, v: DateTime<Utc>) -> Self
pub fn if_modified_since(self, v: DateTime<Utc>) -> Self
Set the If-Modified-Since for this operation.
sourcepub fn if_unmodified_since(self, v: DateTime<Utc>) -> Self
pub fn if_unmodified_since(self, v: DateTime<Utc>) -> Self
Set the If-Unmodified-Since for this operation.
source§impl<F: Future<Output = Result<PresignedRequest>>> OperatorFuture<(OpStat, Duration), PresignedRequest, F>
impl<F: Future<Output = Result<PresignedRequest>>> OperatorFuture<(OpStat, Duration), PresignedRequest, F>
sourcepub fn override_content_disposition(self, v: &str) -> Self
pub fn override_content_disposition(self, v: &str) -> Self
Sets the content-disposition header that should be sent back by the remote read operation.
sourcepub fn override_cache_control(self, v: &str) -> Self
pub fn override_cache_control(self, v: &str) -> Self
Sets the cache-control header that should be sent back by the remote read operation.
sourcepub fn override_content_type(self, v: &str) -> Self
pub fn override_content_type(self, v: &str) -> Self
Sets the content-type header that should be sent back by the remote read operation.
sourcepub fn if_none_match(self, v: &str) -> Self
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>
impl<F: Future<Output = Result<PresignedRequest>>> OperatorFuture<(OpRead, Duration), PresignedRequest, F>
sourcepub fn override_content_disposition(self, v: &str) -> Self
pub fn override_content_disposition(self, v: &str) -> Self
Sets the content-disposition header that should be sent back by the remote read operation.
sourcepub fn override_cache_control(self, v: &str) -> Self
pub fn override_cache_control(self, v: &str) -> Self
Sets the cache-control header that should be sent back by the remote read operation.
sourcepub fn override_content_type(self, v: &str) -> Self
pub fn override_content_type(self, v: &str) -> Self
Sets the content-type header that should be sent back by the remote read operation.
sourcepub fn if_none_match(self, v: &str) -> Self
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>
impl<F: Future<Output = Result<PresignedRequest>>> OperatorFuture<(OpWrite, Duration), PresignedRequest, F>
sourcepub fn content_type(self, v: &str) -> Self
pub fn content_type(self, v: &str) -> Self
Set the content type of option
sourcepub fn content_disposition(self, v: &str) -> Self
pub fn content_disposition(self, v: &str) -> Self
Set the content disposition of option
sourcepub fn cache_control(self, v: &str) -> Self
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>
impl<F: Future<Output = Result<Buffer>>> OperatorFuture<(OpRead, OpReader), Buffer, F>
sourcepub fn range(self, range: impl RangeBounds<u64>) -> Self
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 file1024..
means read bytes in range[1024, n)
of file
let bs = op.read_with("path/to/file").range(0..1024).await?;
sourcepub fn concurrent(self, concurrent: usize) -> Self
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?;
sourcepub fn chunk(self, chunk_size: usize) -> Self
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?;
sourcepub fn version(self, v: &str) -> Self
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?;
sourcepub fn if_match(self, v: &str) -> Self
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?;
sourcepub fn if_none_match(self, v: &str) -> Self
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?;
sourcepub fn if_modified_since(self, v: DateTime<Utc>) -> Self
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?;
sourcepub fn if_unmodified_since(self, v: DateTime<Utc>) -> Self
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>
impl<F: Future<Output = Result<Reader>>> OperatorFuture<(OpRead, OpReader), Reader, F>
sourcepub fn version(self, v: &str) -> Self
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?;
sourcepub fn concurrent(self, concurrent: usize) -> Self
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?;
sourcepub fn chunk(self, chunk_size: usize) -> Self
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?;
sourcepub fn gap(self, gap_size: usize) -> Self
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?;
sourcepub fn if_match(self, etag: &str) -> Self
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?;
sourcepub fn if_none_match(self, etag: &str) -> Self
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?;
sourcepub fn if_modified_since(self, v: DateTime<Utc>) -> Self
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?;
sourcepub fn if_unmodified_since(self, v: DateTime<Utc>) -> Self
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>
impl<F: Future<Output = Result<()>>> OperatorFuture<(OpWrite, OpWriter, Buffer), (), F>
sourcepub fn append(self, v: bool) -> Self
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?;
sourcepub fn chunk(self, v: usize) -> Self
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?;
sourcepub fn concurrent(self, v: usize) -> Self
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?;
sourcepub fn cache_control(self, v: &str) -> Self
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
sourcepub fn content_type(self, v: &str) -> Self
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?;
sourcepub fn content_disposition(self, v: &str) -> Self
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 browserattachment
- Content downloaded as fileattachment; 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?;
sourcepub fn content_encoding(self, v: &str) -> Self
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 compressiondeflate
- Content encoded using deflate compressionbr
- Content encoded using Brotli compressionidentity
- 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?;
sourcepub fn if_match(self, s: &str) -> Self
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
- A specific ETag value like
- 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?;
sourcepub fn if_none_match(self, s: &str) -> Self
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
- A specific ETag value like
- 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?;
sourcepub fn if_not_exists(self, b: bool) -> Self
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?;
sourcepub fn user_metadata(
self,
data: impl IntoIterator<Item = (String, String)>,
) -> Self
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>
impl<F: Future<Output = Result<Writer>>> OperatorFuture<(OpWrite, OpWriter), Writer, F>
sourcepub fn append(self, v: bool) -> Self
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?;
sourcepub fn chunk(self, v: usize) -> Self
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?;
sourcepub fn concurrent(self, v: usize) -> Self
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?;
sourcepub fn cache_control(self, v: &str) -> Self
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
sourcepub fn content_type(self, v: &str) -> Self
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?;
sourcepub fn content_disposition(self, v: &str) -> Self
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 browserattachment
- Content downloaded as fileattachment; 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?;
sourcepub fn content_encoding(self, v: &str) -> Self
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 compressiondeflate
- Content encoded using deflate compressionbr
- Content encoded using Brotli compressionidentity
- 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?;
sourcepub fn if_match(self, s: &str) -> Self
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
- A specific ETag value like
- 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?;
sourcepub fn if_none_match(self, s: &str) -> Self
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
- A specific ETag value like
- 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?;
sourcepub fn if_not_exists(self, b: bool) -> Self
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?;
sourcepub fn user_metadata(
self,
data: impl IntoIterator<Item = (String, String)>,
) -> Self
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<Vec<Entry>>>> OperatorFuture<OpList, Vec<Entry>, F>
impl<F: Future<Output = Result<Vec<Entry>>>> OperatorFuture<OpList, Vec<Entry>, F>
sourcepub fn limit(self, v: usize) -> Self
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.
sourcepub fn start_after(self, v: &str) -> Self
pub fn start_after(self, v: &str) -> Self
The start_after passes to underlying service to specify the specified key to start listing from.
sourcepub fn recursive(self, v: bool) -> Self
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
.
sourcepub fn version(self, v: bool) -> Self
👎Deprecated since 0.51.1: use versions instead
pub fn version(self, v: bool) -> Self
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
sourcepub fn versions(self, v: bool) -> Self
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
sourcepub fn deleted(self, v: bool) -> Self
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>
impl<F: Future<Output = Result<Lister>>> OperatorFuture<OpList, Lister, F>
sourcepub fn limit(self, v: usize) -> Self
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.
sourcepub fn start_after(self, v: &str) -> Self
pub fn start_after(self, v: &str) -> Self
The start_after passes to underlying service to specify the specified key to start listing from.
sourcepub fn recursive(self, v: bool) -> Self
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
.
sourcepub fn version(self, v: bool) -> Self
👎Deprecated since 0.51.1: use versions instead
pub fn version(self, v: bool) -> Self
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
sourcepub fn versions(self, v: bool) -> Self
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
sourcepub fn deleted(self, v: bool) -> Self
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>
impl<I, O, F> IntoFuture for OperatorFuture<I, O, F>
§type IntoFuture = F
type IntoFuture = F
source§fn into_future(self) -> Self::IntoFuture
fn into_future(self) -> Self::IntoFuture
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CompatExt for T
impl<T> CompatExt for T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.