From 671cb12ea54b132897e12767993880e9308e6b23 Mon Sep 17 00:00:00 2001 From: tu6ge Date: Mon, 10 Apr 2023 14:10:02 +0800 Subject: [PATCH] feat(types): Add priv in inner type --- src/bucket.rs | 4 +-- src/config.rs | 8 +++--- src/tests/errors.rs | 20 +++++++------- src/types.rs | 56 +++++++++++++++++++++++++++------------- src/types/object.rs | 55 ++++++++++++++++++++------------------- src/types/object/test.rs | 10 ++++--- 6 files changed, 89 insertions(+), 64 deletions(-) diff --git a/src/bucket.rs b/src/bucket.rs index f48e183..62cdf38 100644 --- a/src/bucket.rs +++ b/src/bucket.rs @@ -258,10 +258,10 @@ mod test_bucket_error { fn assert_impl() {} #[test] fn display() { - let error = BucketError::BucketName(InvalidBucketName {}, "abc".to_string()); + let error = BucketError::BucketName(InvalidBucketName { _priv: () }, "abc".to_string()); assert_eq!(error.to_string(), "covert bucket name failed, bucket 名称只允许小写字母、数字、短横线(-),且不能以短横线开头或结尾, source str: abc"); - let error = BucketError::EndPoint(InvalidEndPoint {}, "abc".to_string()); + let error = BucketError::EndPoint(InvalidEndPoint { _priv: () }, "abc".to_string()); assert_eq!(error.to_string(), "convert endpoint failed, endpoint must not with `-` prefix or `-` suffix or `oss-` prefix, source str: abc"); let error = BucketError::InvalidStorageClass("abc".to_string()); diff --git a/src/config.rs b/src/config.rs index 26e5c62..ad09789 100644 --- a/src/config.rs +++ b/src/config.rs @@ -512,14 +512,14 @@ mod tests { #[test] fn test_invalid_config() { - let error = InvalidEndPoint {}; + let error = InvalidEndPoint { _priv: () }; let error2: InvalidConfig = error.into(); assert_eq!( format!("{error2}"), "endpoint must not with `-` prefix or `-` suffix or `oss-` prefix" ); - let error = InvalidBucketName {}; + let error = InvalidBucketName { _priv: () }; let error2: InvalidConfig = error.into(); assert_eq!( format!("{error2}"), @@ -587,14 +587,14 @@ mod tests { #[test] fn test_invalid_bucket_base() { - let error = InvalidEndPoint {}; + let error = InvalidEndPoint { _priv: () }; let base_err: InvalidBucketBase = error.into(); assert_eq!( format!("{base_err}"), "endpoint must not with `-` prefix or `-` suffix or `oss-` prefix" ); - let error = InvalidBucketName {}; + let error = InvalidBucketName { _priv: () }; let error2: InvalidBucketBase = error.into(); assert_eq!( format!("{error2}"), diff --git a/src/tests/errors.rs b/src/tests/errors.rs index 6f8a4d2..9925862 100644 --- a/src/tests/errors.rs +++ b/src/tests/errors.rs @@ -74,21 +74,21 @@ mod debug { #[test] fn test_endpoint() { - let err = Error::InvalidEndPoint(InvalidEndPoint {}); + let err = Error::InvalidEndPoint(InvalidEndPoint { _priv: () }); assert_eq!( format!("{err}"), "endpoint must not with `-` prefix or `-` suffix or `oss-` prefix" ); fn bar() -> Error { - InvalidEndPoint {}.into() + InvalidEndPoint { _priv: () }.into() } assert_eq!(format!("{:?}", bar()), "InvalidEndPoint(InvalidEndPoint)"); } #[test] fn test_bucket_name() { - let err = Error::InvalidBucketName(InvalidBucketName {}); + let err = Error::InvalidBucketName(InvalidBucketName { _priv: () }); assert_eq!( format!("{err}"), @@ -96,7 +96,7 @@ mod debug { ); fn bar() -> Error { - InvalidBucketName {}.into() + InvalidBucketName { _priv: () }.into() } assert_eq!( format!("{:?}", bar()), @@ -107,7 +107,7 @@ mod debug { #[test] fn test_config() { use crate::config::InvalidConfig::BucketName; - let err = Error::InvalidConfig(BucketName(InvalidBucketName {})); + let err = Error::InvalidConfig(BucketName(InvalidBucketName { _priv: () })); assert_eq!( format!("{err}"), @@ -115,7 +115,7 @@ mod debug { ); fn bar() -> Error { - BucketName(InvalidBucketName {}).into() + BucketName(InvalidBucketName { _priv: () }).into() } assert_eq!( format!("{:?}", bar()), @@ -125,12 +125,12 @@ mod debug { #[test] fn test_object_path() { - let err = Error::InvalidObjectPath(InvalidObjectPath {}); + let err = Error::InvalidObjectPath(InvalidObjectPath { _priv: () }); assert_eq!(format!("{err}"), "invalid object path"); fn bar() -> Error { - InvalidObjectPath {}.into() + InvalidObjectPath { _priv: () }.into() } assert_eq!( format!("{:?}", bar()), @@ -140,12 +140,12 @@ mod debug { #[test] fn test_object_dir() { - let err = Error::InvalidObjectDir(InvalidObjectDir {}); + let err = Error::InvalidObjectDir(InvalidObjectDir { _priv: () }); assert_eq!(format!("{err}"), "ObjectDir must end with `/`"); fn bar() -> Error { - InvalidObjectDir {}.into() + InvalidObjectDir { _priv: () }.into() } assert_eq!(format!("{:?}", bar()), "InvalidObjectDir(InvalidObjectDir)"); } diff --git a/src/types.rs b/src/types.rs index c417a4b..0a73455 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,7 +1,7 @@ use std::borrow::Cow; use std::collections::HashMap; use std::error::Error; -use std::fmt::{self, Display, Formatter}; +use std::fmt::{self, Debug, Display, Formatter}; use std::str::FromStr; use chrono::{DateTime, Utc}; @@ -329,15 +329,15 @@ impl<'a> EndPoint { Ok(ApSouthEast1) } else { if url.is_empty() { - return Err(InvalidEndPoint); + return Err(InvalidEndPoint { _priv: () }); } if url.starts_with('-') || url.ends_with('-') { - return Err(InvalidEndPoint); + return Err(InvalidEndPoint { _priv: () }); } if url.starts_with("oss") { - return Err(InvalidEndPoint); + return Err(InvalidEndPoint { _priv: () }); } fn valid_character(c: char) -> bool { @@ -349,7 +349,7 @@ impl<'a> EndPoint { } } if !url.chars().all(valid_character) { - return Err(InvalidEndPoint); + return Err(InvalidEndPoint { _priv: () }); } Ok(Other(Cow::Owned(url.to_owned()))) @@ -359,7 +359,7 @@ impl<'a> EndPoint { /// 从 oss 域名中提取 Endpoint 信息 pub(crate) fn from_host_piece(url: &'a str) -> Result { if !url.starts_with("oss-") { - return Err(InvalidEndPoint); + return Err(InvalidEndPoint { _priv: () }); } Self::new(&url[4..]) } @@ -459,9 +459,17 @@ mod test_endpoint { } /// 无效的可用区 -#[derive(Debug, PartialEq, Eq, Hash)] +#[derive(PartialEq, Eq, Hash)] #[non_exhaustive] -pub struct InvalidEndPoint; +pub struct InvalidEndPoint { + pub(crate) _priv: (), +} + +impl Debug for InvalidEndPoint { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.debug_struct("InvalidEndPoint").finish() + } +} impl Error for InvalidEndPoint {} @@ -599,11 +607,11 @@ impl<'a> BucketName { let bucket = bucket.into(); if bucket.is_empty() { - return Err(InvalidBucketName); + return Err(InvalidBucketName { _priv: () }); } if bucket.starts_with('-') || bucket.ends_with('-') { - return Err(InvalidBucketName); + return Err(InvalidBucketName { _priv: () }); } fn valid_character(c: char) -> bool { @@ -615,7 +623,7 @@ impl<'a> BucketName { } } if !bucket.chars().all(valid_character) { - return Err(InvalidBucketName); + return Err(InvalidBucketName { _priv: () }); } Ok(Self(bucket)) @@ -634,11 +642,11 @@ impl<'a> BucketName { /// ``` pub fn from_static(bucket: &'a str) -> Result { if bucket.is_empty() { - return Err(InvalidBucketName); + return Err(InvalidBucketName { _priv: () }); } if bucket.starts_with('-') || bucket.ends_with('-') { - return Err(InvalidBucketName); + return Err(InvalidBucketName { _priv: () }); } fn valid_character(c: char) -> bool { @@ -650,7 +658,7 @@ impl<'a> BucketName { } } if !bucket.chars().all(valid_character) { - return Err(InvalidBucketName); + return Err(InvalidBucketName { _priv: () }); } Ok(Self(Cow::Owned(bucket.to_owned()))) @@ -689,9 +697,17 @@ impl PartialEq for &str { } /// 无效的 bucket 名称 -#[derive(Debug, PartialEq)] +#[derive(PartialEq)] #[non_exhaustive] -pub struct InvalidBucketName; +pub struct InvalidBucketName { + pub(crate) _priv: (), +} + +impl Debug for InvalidBucketName { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.debug_struct("InvalidBucketName").finish() + } +} impl Error for InvalidBucketName {} @@ -1563,7 +1579,9 @@ impl FromStr for QueryKey { /// 异常的查询条件键 #[derive(Debug)] -pub struct InvalidQueryKey; +pub struct InvalidQueryKey { + _priv: (), +} impl Error for InvalidQueryKey {} @@ -1770,7 +1788,9 @@ impl FromStr for InnerQueryValue<'_> { /// 异常的查询值 #[derive(Debug)] -pub struct InvalidQueryValue; +pub struct InvalidQueryValue { + _priv: (), +} impl Error for InvalidQueryValue {} diff --git a/src/types/object.rs b/src/types/object.rs index f1b7031..6b99acb 100644 --- a/src/types/object.rs +++ b/src/types/object.rs @@ -4,7 +4,7 @@ use oss_derive::oss_gen_rc; use std::sync::Arc; use std::{ borrow::Cow, - fmt::{self, Display}, + fmt::{self, Debug, Display}, ops::{Add, AddAssign}, path::Path, str::FromStr, @@ -368,10 +368,10 @@ impl<'a> ObjectPathInner<'a> { pub fn new(val: impl Into>) -> Result { let val = val.into(); if val.starts_with('/') || val.starts_with('.') || val.ends_with('/') { - return Err(InvalidObjectPath); + return Err(InvalidObjectPath { _priv: () }); } if !val.chars().all(|c| c != '\\') { - return Err(InvalidObjectPath); + return Err(InvalidObjectPath { _priv: () }); } Ok(Self(val)) } @@ -426,11 +426,11 @@ impl FromStr for ObjectPathInner<'_> { /// ``` fn from_str(s: &str) -> Result { if s.starts_with('/') || s.starts_with('.') || s.ends_with('/') { - return Err(InvalidObjectPath); + return Err(InvalidObjectPath { _priv: () }); } if !s.chars().all(|c| c != '\\') { - return Err(InvalidObjectPath); + return Err(InvalidObjectPath { _priv: () }); } Ok(Self(Cow::Owned(s.to_owned()))) } @@ -439,7 +439,7 @@ impl FromStr for ObjectPathInner<'_> { impl TryFrom<&Path> for ObjectPathInner<'_> { type Error = InvalidObjectPath; fn try_from(value: &Path) -> Result { - let val = value.to_str().ok_or(InvalidObjectPath)?; + let val = value.to_str().ok_or(InvalidObjectPath { _priv: () })?; if std::path::MAIN_SEPARATOR != '/' { val.replace(std::path::MAIN_SEPARATOR, "/").parse() } else { @@ -457,19 +457,22 @@ impl From> for ObjectPathInner<'static> { } /// 不合法的文件路径 -#[derive(Debug)] -pub struct InvalidObjectPath; +pub struct InvalidObjectPath { + pub(crate) _priv: (), +} impl Display for InvalidObjectPath { - /// ``` - /// # use aliyun_oss_client::types::object::InvalidObjectPath; - /// assert_eq!(format!("{}", InvalidObjectPath), "invalid object path"); - /// ``` fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "invalid object path") } } +impl Debug for InvalidObjectPath { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InvalidObjectPath").finish() + } +} + impl std::error::Error for InvalidObjectPath {} /// 将 object 的路径拼接到 Url 上去 @@ -642,10 +645,10 @@ impl<'a> ObjectDir<'a> { pub fn new<'b: 'a>(val: impl Into>) -> Result { let val = val.into(); if val.starts_with('/') || val.starts_with('.') || !val.ends_with('/') { - return Err(InvalidObjectDir); + return Err(InvalidObjectDir { _priv: () }); } if !val.chars().all(|c| c != '\\') { - return Err(InvalidObjectDir); + return Err(InvalidObjectDir { _priv: () }); } Ok(Self(val)) } @@ -699,11 +702,11 @@ impl FromStr for ObjectDir<'_> { /// ``` fn from_str(s: &str) -> Result { if s.starts_with('/') || s.starts_with('.') || !s.ends_with('/') { - return Err(InvalidObjectDir); + return Err(InvalidObjectDir { _priv: () }); } if !s.chars().all(|c| c != '\\') { - return Err(InvalidObjectDir); + return Err(InvalidObjectDir { _priv: () }); } Ok(Self(Cow::Owned(s.to_owned()))) } @@ -712,7 +715,7 @@ impl FromStr for ObjectDir<'_> { impl TryFrom<&Path> for ObjectDir<'_> { type Error = InvalidObjectDir; fn try_from(value: &Path) -> Result { - let val = value.to_str().ok_or(InvalidObjectDir)?; + let val = value.to_str().ok_or(InvalidObjectDir { _priv: () })?; if std::path::MAIN_SEPARATOR != '/' { val.replace(std::path::MAIN_SEPARATOR, "/").parse() } else { @@ -722,22 +725,22 @@ impl TryFrom<&Path> for ObjectDir<'_> { } /// 不合法的文件目录路径 -#[derive(Debug)] -pub struct InvalidObjectDir; +pub struct InvalidObjectDir { + pub(crate) _priv: (), +} impl Display for InvalidObjectDir { - /// ``` - /// # use aliyun_oss_client::types::object::InvalidObjectDir; - /// assert_eq!( - /// format!("{}", InvalidObjectDir), - /// "ObjectDir must end with `/`" - /// ); - /// ``` fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "ObjectDir must end with `/`") } } +impl Debug for InvalidObjectDir { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InvalidObjectDir").finish() + } +} + impl std::error::Error for InvalidObjectDir {} /// 给 Url 设置一个初始化方法,根据 OSS 的配置信息,返回文件的完整 OSS Url diff --git a/src/types/object/test.rs b/src/types/object/test.rs index ca83bea..7236361 100644 --- a/src/types/object/test.rs +++ b/src/types/object/test.rs @@ -56,7 +56,7 @@ mod test_core { "bucket url must like with https://yyy.xxx.aliyuncs.com" ); - let path = InvalidObjectBase::Path(InvalidObjectPath {}); + let path = InvalidObjectBase::Path(InvalidObjectPath { _priv: () }); assert_eq!(format!("{path}"), "invalid object path"); assert_eq!(format!("{path:?}"), "Path(InvalidObjectPath)"); @@ -94,7 +94,7 @@ mod test_core { assert_eq!(dir, ObjectDir::new("path/").unwrap()); let dir = ObjectDir::try_from("path").unwrap_err(); - assert!(matches!(dir, InvalidObjectDir {})); + assert!(matches!(dir, InvalidObjectDir { _priv: () })); } #[test] fn test_dir_from_path() { @@ -106,7 +106,8 @@ mod test_core { #[test] fn test_invalid_dir_debug() { - let err = InvalidObjectDir {}; + let err = InvalidObjectDir { _priv: () }; + assert_eq!(format!("{err}"), "ObjectDir must end with `/`"); assert_eq!(format!("{err:?}"), "InvalidObjectDir"); } @@ -125,7 +126,8 @@ mod test_core { #[test] fn test_invalid_path_debug() { - let err = InvalidObjectPath {}; + let err = InvalidObjectPath { _priv: () }; + assert_eq!(format!("{err}"), "invalid object path"); assert_eq!(format!("{err:?}"), "InvalidObjectPath"); }