Skip to content

Commit

Permalink
feat(core): Add AsRef in some type
Browse files Browse the repository at this point in the history
  • Loading branch information
tu6ge committed Mar 14, 2023
1 parent ae18f7c commit 2b72ba0
Show file tree
Hide file tree
Showing 7 changed files with 193 additions and 61 deletions.
4 changes: 1 addition & 3 deletions src/auth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -390,9 +390,7 @@ impl<'a> SignString<'a> {

// 转化成签名
#[inline]
pub(crate) fn to_sign<'b>(
&'b self,
) -> Result<Sign<'b>, hmac::digest::crypto_common::InvalidLength> {
pub(crate) fn to_sign(&self) -> Result<Sign, hmac::digest::crypto_common::InvalidLength> {
use base64::encode;
use hmac::{Hmac, Mac};
use sha1::Sha1;
Expand Down
18 changes: 18 additions & 0 deletions src/bucket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,24 @@ impl Default for Bucket<ArcPointer> {
}
}

impl<T: PointerFamily> AsRef<BucketBase> for Bucket<T> {
fn as_ref(&self) -> &BucketBase {
&self.base
}
}

impl<T: PointerFamily> AsRef<BucketName> for Bucket<T> {
fn as_ref(&self) -> &BucketName {
self.base.as_ref()
}
}

impl<T: PointerFamily> AsRef<EndPoint> for Bucket<T> {
fn as_ref(&self) -> &EndPoint {
self.base.as_ref()
}
}

impl<T: PointerFamily> RefineBucket<OssError> for Bucket<T> {
fn set_name(&mut self, name: &str) -> Result<(), OssError> {
self.base.set_name(name.parse::<BucketName>()?);
Expand Down
17 changes: 17 additions & 0 deletions src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,23 @@ where
timeout: Option<Duration>,
}

impl<M: Default + Clone> AsMut<Option<Duration>> for Client<M> {
fn as_mut(&mut self) -> &mut Option<Duration> {
&mut self.timeout
}
}

impl<M: Default + Clone> AsRef<EndPoint> for Client<M> {
fn as_ref(&self) -> &EndPoint {
&self.endpoint
}
}
impl<M: Default + Clone> AsRef<BucketName> for Client<M> {
fn as_ref(&self) -> &BucketName {
&self.bucket
}
}

impl<M: Default + Clone> Client<M> {
/// 使用基本配置信息初始化 Client
pub fn new(
Expand Down
74 changes: 70 additions & 4 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,30 @@ pub struct Config {
bucket: BucketName,
}

impl AsRef<KeyId> for Config {
fn as_ref(&self) -> &KeyId {
&self.key
}
}

impl AsRef<KeySecret> for Config {
fn as_ref(&self) -> &KeySecret {
&self.secret
}
}

impl AsRef<EndPoint> for Config {
fn as_ref(&self) -> &EndPoint {
&self.endpoint
}
}

impl AsRef<BucketName> for Config {
fn as_ref(&self) -> &BucketName {
&self.bucket
}
}

impl Config {
/// 初始化 OSS 配置信息
pub fn new<ID, S, E, B>(key: ID, secret: S, endpoint: E, bucket: B) -> Config
Expand Down Expand Up @@ -116,6 +140,30 @@ pub struct BucketBase {
name: BucketName,
}

impl AsMut<EndPoint> for BucketBase {
fn as_mut(&mut self) -> &mut EndPoint {
&mut self.endpoint
}
}

impl AsMut<BucketName> for BucketBase {
fn as_mut(&mut self) -> &mut BucketName {
&mut self.name
}
}

impl AsRef<EndPoint> for BucketBase {
fn as_ref(&self) -> &EndPoint {
&self.endpoint
}
}

impl AsRef<BucketName> for BucketBase {
fn as_ref(&self) -> &BucketName {
&self.name
}
}

const HTTPS: &str = "https://";

impl FromStr for BucketBase {
Expand Down Expand Up @@ -316,7 +364,10 @@ impl BucketBase {
}

/// 根据查询参数,获取当前 bucket 的接口请求参数( url 和 CanonicalizedResource)
pub fn get_url_resource_with_path(&self, path: &ObjectPath) -> (Url, CanonicalizedResource) {
pub fn get_url_resource_with_path(
&self,
path: &ObjectPathInner,
) -> (Url, CanonicalizedResource) {
let mut url = self.to_url();
url.set_object_path(path);

Expand Down Expand Up @@ -347,7 +398,7 @@ impl BuildFromBucket for Url {
pub fn get_url_resource(
endpoint: &EndPoint,
bucket: &BucketName,
path: &ObjectPath,
path: &ObjectPathInner,
) -> (Url, CanonicalizedResource) {
let mut url = Url::from_bucket(endpoint, bucket);
url.set_object_path(path);
Expand All @@ -357,6 +408,15 @@ pub fn get_url_resource(
(url, resource)
}

/// 根据 endpoint, bucket, path 获取接口信息
pub fn get_url_resource2<E: AsRef<EndPoint>, B: AsRef<BucketName>>(
endpoint: E,
bucket: B,
path: &ObjectPathInner,
) -> (Url, CanonicalizedResource) {
get_url_resource(endpoint.as_ref(), bucket.as_ref(), path)
}

/// Bucket 元信息的错误集
#[derive(Error, Debug)]
#[non_exhaustive]
Expand Down Expand Up @@ -408,6 +468,12 @@ impl<T: PointerFamily> Default for ObjectBase<T> {
}
}

impl<T: PointerFamily> AsRef<ObjectPath> for ObjectBase<T> {
fn as_ref(&self) -> &ObjectPath {
&self.path
}
}

impl<T: PointerFamily> ObjectBase<T> {
/// 初始化 Object 元信息
pub fn new<P>(bucket: T::Bucket, path: P) -> Result<Self, InvalidObjectPath>
Expand Down Expand Up @@ -814,11 +880,11 @@ impl Display for InvalidObjectPath {
/// 将 object 的路径拼接到 Url 上去
pub trait UrlObjectPath {
/// 为 Url 添加方法
fn set_object_path(&mut self, path: &ObjectPath);
fn set_object_path(&mut self, path: &ObjectPathInner);
}

impl UrlObjectPath for Url {
fn set_object_path(&mut self, path: &ObjectPath) {
fn set_object_path(&mut self, path: &ObjectPathInner) {
self.set_path(path.as_ref());
}
}
Expand Down
57 changes: 17 additions & 40 deletions src/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,15 +212,14 @@ mod std_path_impl {
bucket::Bucket,
builder::ArcPointer,
client::ClientArc,
config::{get_url_resource, ObjectBase},
config::{get_url_resource2 as get_url_resource, ObjectBase},
decode::{ItemError, RefineObject},
object::ObjectList,
types::CanonicalizedResource,
ObjectPath,
};
use oss_derive::oss_gen_rc;
use reqwest::Url;
use std::sync::Arc;

/// # 用于在 Client 上对文件进行操作
///
Expand All @@ -231,11 +230,7 @@ mod std_path_impl {
impl GetStdWithPath<String> for ClientArc {
fn get_std_with_path(&self, path: String) -> Option<(Url, CanonicalizedResource)> {
let object_path = path.try_into().ok()?;
Some(get_url_resource(
self.get_endpoint(),
self.get_bucket_name(),
&object_path,
))
Some(get_url_resource(self, self, &object_path))
}
}

Expand All @@ -247,12 +242,8 @@ mod std_path_impl {
#[oss_gen_rc]
impl GetStdWithPath<&str> for ClientArc {
fn get_std_with_path(&self, path: &str) -> Option<(Url, CanonicalizedResource)> {
let object_path = path.to_owned().try_into().ok()?;
Some(get_url_resource(
self.get_endpoint(),
self.get_bucket_name(),
&object_path,
))
let object_path = path.try_into().ok()?;
Some(get_url_resource(self, self, &object_path))
}
}

Expand All @@ -264,11 +255,7 @@ mod std_path_impl {
#[oss_gen_rc]
impl GetStdWithPath<ObjectPath> for ClientArc {
fn get_std_with_path(&self, path: ObjectPath) -> Option<(Url, CanonicalizedResource)> {
Some(get_url_resource(
self.get_endpoint(),
self.get_bucket_name(),
&path,
))
Some(get_url_resource(self, self, &path))
}
}

Expand All @@ -280,11 +267,7 @@ mod std_path_impl {
#[oss_gen_rc]
impl GetStdWithPath<&ObjectPath> for ClientArc {
fn get_std_with_path(&self, path: &ObjectPath) -> Option<(Url, CanonicalizedResource)> {
Some(get_url_resource(
self.get_endpoint(),
self.get_bucket_name(),
path,
))
Some(get_url_resource(self, self, path))
}
}

Expand Down Expand Up @@ -329,7 +312,7 @@ mod std_path_impl {
/// 文件路径可以是 `&str` 类型
impl GetStdWithPath<&str> for Bucket {
fn get_std_with_path(&self, path: &str) -> Option<(Url, CanonicalizedResource)> {
let path = path.to_owned().try_into().ok()?;
let path = path.try_into().ok()?;
Some(self.base.get_url_resource_with_path(&path))
}
}
Expand Down Expand Up @@ -399,12 +382,10 @@ mod std_path_impl {
impl<Item: RefineObject<E> + Send + Sync, E: ItemError + Send + Sync> GetStdWithPath<String>
for ObjectList<ArcPointer, Item, E>
{
#[inline]
fn get_std_with_path(&self, path: String) -> Option<(Url, CanonicalizedResource)> {
let object_base = ObjectBase::<ArcPointer>::new2(
Arc::new(self.bucket.to_owned()),
path.try_into().ok()?,
);
Some(object_base.get_url_resource([]))
let object_path = path.try_into().ok()?;
Some(get_url_resource(self, self, &object_path))
}
}

Expand All @@ -417,12 +398,10 @@ mod std_path_impl {
impl<Item: RefineObject<E> + Send + Sync, E: ItemError + Send + Sync> GetStdWithPath<&str>
for ObjectList<ArcPointer, Item, E>
{
#[inline]
fn get_std_with_path(&self, path: &str) -> Option<(Url, CanonicalizedResource)> {
let object_base = ObjectBase::<ArcPointer>::new2(
Arc::new(self.bucket.to_owned()),
path.to_owned().try_into().ok()?,
);
Some(object_base.get_url_resource([]))
let object_path = path.try_into().ok()?;
Some(get_url_resource(self, self, &object_path))
}
}

Expand All @@ -435,10 +414,9 @@ mod std_path_impl {
impl<Item: RefineObject<E> + Send + Sync, E: ItemError + Send + Sync> GetStdWithPath<ObjectPath>
for ObjectList<ArcPointer, Item, E>
{
#[inline]
fn get_std_with_path(&self, path: ObjectPath) -> Option<(Url, CanonicalizedResource)> {
let object_base =
ObjectBase::<ArcPointer>::new2(Arc::new(self.bucket.to_owned()), path);
Some(object_base.get_url_resource([]))
Some(get_url_resource(self, self, &path))
}
}

Expand All @@ -451,10 +429,9 @@ mod std_path_impl {
impl<Item: RefineObject<E> + Send + Sync, E: ItemError + Send + Sync>
GetStdWithPath<&ObjectPath> for ObjectList<ArcPointer, Item, E>
{
#[inline]
fn get_std_with_path(&self, path: &ObjectPath) -> Option<(Url, CanonicalizedResource)> {
let object_base =
ObjectBase::<ArcPointer>::new2(Arc::new(self.bucket.to_owned()), path.to_owned());
Some(object_base.get_url_resource([]))
Some(get_url_resource(self, self, path))
}
}

Expand Down
52 changes: 51 additions & 1 deletion src/object.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ use crate::file::AlignBuilder;
use crate::types::{
CanonicalizedResource, Query, QueryKey, QueryValue, UrlQuery, CONTINUATION_TOKEN,
};
use crate::{BucketName, Client};
use crate::{BucketName, Client, EndPoint};
use async_stream::try_stream;
use chrono::{DateTime, NaiveDateTime, Utc};
use futures_core::stream::Stream;
Expand Down Expand Up @@ -164,6 +164,38 @@ impl<Item: RefineObject<E>, E: ItemError> Default for ObjectList<ArcPointer, Ite
}
}

impl<T: PointerFamily, Item: RefineObject<E>, E: ItemError> AsMut<Query>
for ObjectList<T, Item, E>
{
fn as_mut(&mut self) -> &mut Query {
&mut self.search_query
}
}

impl<T: PointerFamily, Item: RefineObject<E>, E: ItemError> AsRef<BucketBase>
for ObjectList<T, Item, E>
{
fn as_ref(&self) -> &BucketBase {
&self.bucket
}
}

impl<T: PointerFamily, Item: RefineObject<E>, E: ItemError> AsRef<BucketName>
for ObjectList<T, Item, E>
{
fn as_ref(&self) -> &BucketName {
self.bucket.as_ref()
}
}

impl<T: PointerFamily, Item: RefineObject<E>, E: ItemError> AsRef<EndPoint>
for ObjectList<T, Item, E>
{
fn as_ref(&self) -> &EndPoint {
self.bucket.as_ref()
}
}

impl<T: PointerFamily, Item: RefineObject<E>, E: ItemError> ObjectList<T, Item, E> {
/// 文件列表的初始化方法
#[allow(clippy::too_many_arguments)]
Expand Down Expand Up @@ -456,6 +488,24 @@ impl<T: PointerFamily> Default for Object<T> {
}
}

impl<T: PointerFamily> AsRef<ObjectPath> for Object<T> {
fn as_ref(&self) -> &ObjectPath {
self.base.as_ref()
}
}

impl<T: PointerFamily> AsRef<DateTime<Utc>> for Object<T> {
fn as_ref(&self) -> &DateTime<Utc> {
&self.last_modified
}
}

impl<T: PointerFamily> AsRef<StorageClass> for Object<T> {
fn as_ref(&self) -> &StorageClass {
&self.storage_class
}
}

impl<T: PointerFamily> Object<T> {
/// 初始化 Object 结构体
pub fn new(
Expand Down
Loading

0 comments on commit 2b72ba0

Please sign in to comment.