blob: 1153a93f832905fc4ca97913ec1dacb3f4c4ce7f [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
use std::fmt::Debug;
/// Capability is used to describe what operations are supported
/// by current Operator.
///
/// Via capability, we can know:
///
/// - Whether current Operator supports read or not.
/// - Whether current Operator supports read with if match or not.
/// - What's current Operator max supports batch operations count.
///
/// Add fields of Capabilities with be public and can be accessed directly.
///
/// # Notes
///
/// Capabilities reflects the native support for operations. It's possible
/// that some operations are not supported by current Operator, but still
/// can be used.
///
/// For examples, we will support `seek` and `next` for all readers
/// returned by services.
///
/// # Naming Style
///
/// - Operation itself should be in lower case, like `read`, `write`.
/// - Operation with sub operations should be named like `presign_read`.
/// - Operation with variants should be named like `read_can_seek`.
/// - Operation with arguments should be named like `read_with_range`.
/// - Operation with limitations should be named like `batch_max_operations`.
#[derive(Copy, Clone, Default)]
pub struct Capability {
/// If operator supports stat natively, it will be true.
pub stat: bool,
/// If operator supports stat with if match natively, it will be true.
pub stat_with_if_match: bool,
/// If operator supports stat with if none match natively, it will be true.
pub stat_with_if_none_match: bool,
/// If operator supports read natively, it will be true.
pub read: bool,
/// If operator supports seek on returning reader natively, it will
/// be true.
pub read_can_seek: bool,
/// If operator supports next on returning reader natively, it will
/// be true.
pub read_can_next: bool,
/// If operator supports read with range natively, it will be true.
pub read_with_range: bool,
/// If operator supports read with if match natively, it will be true.
pub read_with_if_match: bool,
/// If operator supports read with if none match natively, it will be true.
pub read_with_if_none_match: bool,
/// if operator supports read with override cache control natively, it will be true.
pub read_with_override_cache_control: bool,
/// if operator supports read with override content disposition natively, it will be true.
pub read_with_override_content_disposition: bool,
/// If operator supports write natively, it will be true.
pub write: bool,
/// If operator supports write with without content length, it will
/// be true.
///
/// This feature also be called as `Unsized` write or streaming write.
pub write_without_content_length: bool,
/// If operator supports write with content type natively, it will be true.
pub write_with_content_type: bool,
/// If operator supports write with content disposition natively, it will be true.
pub write_with_content_disposition: bool,
/// If operator supports write with cache control natively, it will be true.
pub write_with_cache_control: bool,
/// If operator supports append natively, it will be true.
pub append: bool,
/// If operator supports append with content type natively, it will be true.
pub append_with_content_type: bool,
/// If operator supports append with content disposition natively, it will be true.
pub append_with_content_disposition: bool,
/// If operator supports append with cache control natively, it will be true.
pub append_with_cache_control: bool,
/// If operator supports create dir natively, it will be true.
pub create_dir: bool,
/// If operator supports delete natively, it will be true.
pub delete: bool,
/// If operator supports copy natively, it will be true.
pub copy: bool,
/// If operator supports rename natively, it will be true.
pub rename: bool,
/// If operator supports list natively, it will be true.
pub list: bool,
/// If backend supports list with limit, it will be true.
pub list_with_limit: bool,
/// If backend supports list with start after, it will be true.
pub list_with_start_after: bool,
/// If backend support list with using slash as delimiter.
pub list_with_delimiter_slash: bool,
/// If backend supports list without delimiter.
pub list_without_delimiter: bool,
/// If operator supports presign natively, it will be true.
pub presign: bool,
/// If operator supports presign read natively, it will be true.
pub presign_read: bool,
/// If operator supports presign stat natively, it will be true.
pub presign_stat: bool,
/// If operator supports presign write natively, it will be true.
pub presign_write: bool,
/// If operator supports batch natively, it will be true.
pub batch: bool,
/// If operator supports batch delete natively, it will be true.
pub batch_delete: bool,
/// The max operations that operator supports in batch.
pub batch_max_operations: Option<usize>,
/// If operator supports blocking natively, it will be true.
pub blocking: bool,
}
impl Debug for Capability {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut s = vec![];
if self.stat {
s.push("Stat");
}
if self.read {
s.push("Read");
}
if self.write {
s.push("Write");
}
if self.append {
s.push("Append");
}
if self.create_dir {
s.push("CreateDir");
}
if self.delete {
s.push("Delete");
}
if self.copy {
s.push("Copy");
}
if self.rename {
s.push("Rename");
}
if self.list {
s.push("List");
}
if self.presign {
s.push("Presign");
}
if self.batch {
s.push("Batch");
}
if self.blocking {
s.push("Blocking");
}
write!(f, "{{ {} }}", s.join(" | "))
}
}