Skip to content

Commit

Permalink
feat(object): ObjectList Add Item generic
Browse files Browse the repository at this point in the history
refrence #12
  • Loading branch information
tu6ge committed Feb 16, 2023
1 parent 2d8f842 commit 63d85e2
Show file tree
Hide file tree
Showing 7 changed files with 291 additions and 136 deletions.
14 changes: 5 additions & 9 deletions examples/custom.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@ struct MyFile {
other: String,
}

impl RefineObject for MyFile {
type Error = MyError;

fn set_key(&mut self, key: &str) -> Result<(), Self::Error> {
impl RefineObject<MyError> for MyFile {
fn set_key(&mut self, key: &str) -> Result<(), MyError> {
self.key = key.to_string();
Ok(())
}
Expand All @@ -30,14 +28,12 @@ struct MyBucket {
files: Vec<MyFile>,
}

impl RefineObjectList<MyFile> for MyBucket {
type Error = MyError;

fn set_name(&mut self, name: &str) -> Result<(), Self::Error> {
impl RefineObjectList<MyFile, MyError> for MyBucket {
fn set_name(&mut self, name: &str) -> Result<(), MyError> {
self.name = name.to_string();
Ok(())
}
fn set_list(&mut self, list: Vec<MyFile>) -> Result<(), Self::Error> {
fn set_list(&mut self, list: Vec<MyFile>) -> Result<(), MyError> {
self.files = list;
Ok(())
}
Expand Down
80 changes: 80 additions & 0 deletions examples/object_custom.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
use aliyun_oss_client::{
builder::{ArcPointer, BuilderError},
config::{InvalidObjectDir, ObjectDir, ObjectPath},
decode::RefineObject,
object::ObjectList,
BucketName, Client,
};
use dotenv::dotenv;

#[derive(Debug)]
enum MyObject {
File(ObjectPath),
Dir(ObjectDir<'static>),
}

impl RefineObject<MyError> for MyObject {
fn set_key(&mut self, key: &str) -> Result<(), MyError> {
let res = key.parse::<ObjectPath>();

*self = match res {
Ok(file) => MyObject::File(file),
_ => {
let re = key.parse::<ObjectDir>();
MyObject::Dir(re.unwrap())
}
};

Ok(())
}
}

struct MyError(String);

impl From<quick_xml::Error> for MyError {
fn from(value: quick_xml::Error) -> Self {
Self(value.to_string())
}
}

impl From<BuilderError> for MyError {
fn from(value: BuilderError) -> Self {
Self(value.to_string())
}
}

impl From<std::num::ParseIntError> for MyError {
fn from(value: std::num::ParseIntError) -> Self {
Self(value.to_string())
}
}

impl From<InvalidObjectDir> for MyError {
fn from(value: InvalidObjectDir) -> Self {
Self(value.to_string())
}
}

type MyList = ObjectList<ArcPointer, MyObject, MyError>;

#[tokio::main]
async fn main() {
dotenv().ok();

let client = Client::from_env().unwrap();

let mut list = MyList::default();

let init_object = || MyObject::File(ObjectPath::default());

let _ = client
.base_object_list(
"xxxxxx".parse::<BucketName>().unwrap(),
[],
&mut list,
init_object,
)
.await;

println!("list: {:?}", list.object_list);
}
14 changes: 5 additions & 9 deletions examples/parse_xml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ struct MyFile {
other: String,
}

impl RefineObject for MyFile {
type Error = MyError;

fn set_key(&mut self, key: &str) -> Result<(), Self::Error> {
impl RefineObject<MyError> for MyFile {
fn set_key(&mut self, key: &str) -> Result<(), MyError> {
self.key = key.to_string();
Ok(())
}
Expand All @@ -22,14 +20,12 @@ struct MyBucket {
files: Vec<MyFile>,
}

impl RefineObjectList<MyFile> for MyBucket {
type Error = MyError;

fn set_name(&mut self, name: &str) -> Result<(), Self::Error> {
impl RefineObjectList<MyFile, MyError> for MyBucket {
fn set_name(&mut self, name: &str) -> Result<(), MyError> {
self.name = name.to_string();
Ok(())
}
fn set_list(&mut self, list: Vec<MyFile>) -> Result<(), Self::Error> {
fn set_list(&mut self, list: Vec<MyFile>) -> Result<(), MyError> {
self.files = list;
Ok(())
}
Expand Down
9 changes: 7 additions & 2 deletions src/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ use crate::{
bucket::Bucket,
builder::{ArcPointer, BuilderError, RequestBuilder},
config::{InvalidObjectPath, ObjectBase, ObjectPath},
decode::RefineObject,
object::{Object, ObjectList},
types::{CanonicalizedResource, ContentRange},
Client,
Expand Down Expand Up @@ -326,7 +327,9 @@ impl Files for Bucket {
}

/// 可将 `Object` 实例作为参数传递给各种操作方法
impl Files for ObjectList<ArcPointer> {
impl<Item: RefineObject<E> + Send + Sync, E: From<quick_xml::Error> + Send + Sync> Files
for ObjectList<ArcPointer, Item, E>
{
type Path = Object<ArcPointer>;
type Err = FileError;
fn get_url(&self, path: Self::Path) -> Result<(Url, CanonicalizedResource), FileError> {
Expand Down Expand Up @@ -533,7 +536,9 @@ impl AlignBuilder for Bucket {
}
}

impl AlignBuilder for ObjectList<ArcPointer> {
impl<Item: RefineObject<E> + Send + Sync, E: From<quick_xml::Error> + Send + Sync> AlignBuilder
for ObjectList<ArcPointer, Item, E>
{
#[inline]
fn builder_with_header<H: IntoIterator<Item = (HeaderName, HeaderValue)>>(
&self,
Expand Down
Loading

0 comments on commit 63d85e2

Please sign in to comment.