Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4ca6363

Browse files
committed
refactor: wasm fs offload apis
1 parent5a01dcb commit4ca6363

File tree

4 files changed

+105
-148
lines changed

4 files changed

+105
-148
lines changed

‎src/fs/wasm/offload/client.rs‎

Lines changed: 37 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{io, path::PathBuf};
1+
use std::{io, path::Path};
22

33
use tokio::sync::{mpsc, oneshot};
44

@@ -10,134 +10,71 @@ pub struct Client {
1010
}
1111

1212
implClient{
13-
pubasyncfnread(&self,path:PathBuf) -> io::Result<Vec<u8>>{
14-
let(sender, receiver) = oneshot::channel();
15-
16-
let task =FsTask::Read{ path, sender};
17-
18-
self.sender
19-
.send(task)
20-
.await
21-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?;
22-
23-
receiver
24-
.await
25-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?
13+
pubasyncfnread(&self,path:implAsRef<Path>) -> io::Result<Vec<u8>>{
14+
let path = path.as_ref().into();
15+
self.dispatch(|sender|FsTask::Read{ path, sender}).await
2616
}
2717

28-
pubasyncfnwrite(&self,path:PathBuf,content:Vec<u8>) -> io::Result<()>{
29-
let(sender, receiver) = oneshot::channel();
30-
31-
let task =FsTask::Write{
18+
pubasyncfnwrite(&self,path:implAsRef<Path>,content:&[u8]) -> io::Result<()>{
19+
letpath = path.as_ref().into();
20+
let content = content.to_vec();
21+
self.dispatch(|sender|FsTask::Write{
3222
path,
3323
sender,
3424
content,
35-
};
36-
37-
self.sender
38-
.send(task)
39-
.await
40-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?;
41-
42-
receiver
43-
.await
44-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?
25+
})
26+
.await
4527
}
4628

47-
pubasyncfnread_dir(&self,path:PathBuf) -> io::Result<ReadDir>{
48-
let(sender, receiver) = oneshot::channel();
49-
50-
let task =FsTask::ReadDir{ path, sender};
51-
52-
self.sender
53-
.send(task)
54-
.await
55-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?;
56-
57-
receiver
29+
pubasyncfnread_dir(&self,path:implAsRef<Path>) -> io::Result<ReadDir>{
30+
let path = path.as_ref().into();
31+
self.dispatch(|sender|FsTask::ReadDir{ path, sender})
5832
.await
59-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?
6033
}
6134

62-
pubasyncfncreate_dir(&self,path:PathBuf) -> io::Result<()>{
63-
let(sender, receiver) = oneshot::channel();
64-
65-
let task =FsTask::CreateDir{ path, sender};
66-
67-
self.sender
68-
.send(task)
69-
.await
70-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?;
71-
72-
receiver
35+
pubasyncfncreate_dir(&self,path:implAsRef<Path>) -> io::Result<()>{
36+
let path = path.as_ref().into();
37+
self.dispatch(|sender|FsTask::CreateDir{ path, sender})
7338
.await
74-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?
7539
}
7640

77-
pubasyncfncreate_dir_all(&self,path:PathBuf) -> io::Result<()>{
78-
let(sender, receiver) = oneshot::channel();
79-
80-
let task =FsTask::CreateDirAll{ path, sender};
81-
82-
self.sender
83-
.send(task)
84-
.await
85-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?;
86-
87-
receiver
41+
pubasyncfncreate_dir_all(&self,path:implAsRef<Path>) -> io::Result<()>{
42+
let path = path.as_ref().into();
43+
self.dispatch(|sender|FsTask::CreateDirAll{ path, sender})
8844
.await
89-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?
9045
}
9146

92-
pubasyncfnremove_file(&self,path:PathBuf) -> io::Result<()>{
93-
let(sender, receiver) = oneshot::channel();
94-
95-
let task =FsTask::RemoveFile{ path, sender};
96-
97-
self.sender
98-
.send(task)
99-
.await
100-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?;
101-
102-
receiver
47+
pubasyncfnremove_file(&self,path:implAsRef<Path>) -> io::Result<()>{
48+
let path = path.as_ref().into();
49+
self.dispatch(|sender|FsTask::RemoveFile{ path, sender})
10350
.await
104-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?
10551
}
10652

107-
pubasyncfnremove_dir(&self,path:PathBuf) -> io::Result<()>{
108-
let(sender, receiver) = oneshot::channel();
109-
110-
let task =FsTask::RemoveDir{ path, sender};
111-
112-
self.sender
113-
.send(task)
114-
.await
115-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?;
116-
117-
receiver
53+
pubasyncfnremove_dir(&self,path:implAsRef<Path>) -> io::Result<()>{
54+
let path = path.as_ref().into();
55+
self.dispatch(|sender|FsTask::RemoveDir{ path, sender})
11856
.await
119-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?
12057
}
12158

122-
pubasyncfnremove_dir_all(&self,path:PathBuf) -> io::Result<()>{
123-
let(sender, receiver) = oneshot::channel();
124-
125-
let task =FsTask::RemoveDirAll{ path, sender};
126-
127-
self.sender
128-
.send(task)
59+
pubasyncfnremove_dir_all(&self,path:implAsRef<Path>) -> io::Result<()>{
60+
let path = path.as_ref().into();
61+
self.dispatch(|sender|FsTask::RemoveDirAll{ path, sender})
12962
.await
130-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?;
63+
}
13164

132-
receiver
65+
pubasyncfnmetadata(&self,path:implAsRef<Path>) -> io::Result<Metadata>{
66+
let path = path.as_ref().into();
67+
self.dispatch(|sender|FsTask::Metadata{ path, sender})
13368
.await
134-
.map_err(|_| io::Error::from(io::ErrorKind::ConnectionAborted))?
13569
}
13670

137-
pubasyncfnmetadata(&self,path:PathBuf) -> io::Result<Metadata>{
71+
asyncfndispatch<T,F>(&self,create_task:F) -> io::Result<T>
72+
where
73+
F:FnOnce(oneshot::Sender<io::Result<T>>) ->FsTask,
74+
{
13875
let(sender, receiver) = oneshot::channel();
13976

140-
let task =FsTask::Metadata{ path,sender};
77+
let task =create_task(sender);
14178

14279
self.sender
14380
.send(task)

‎src/fs/wasm/offload/mod.rs‎

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::{io, path::PathBuf};
22

3+
use tokio::sync::mpsc;
4+
35
usesuper::{
46
Metadata,ReadDir, create_dir, create_dir_all, metadata, read, read_dir, remove_dir,
57
remove_dir_all, remove_file, write,
@@ -11,41 +13,60 @@ mod task;
1113

1214
pubuseself::{client::Client, server::Server, task::FsTask};
1315

14-
pubfnoffload() ->(Server,Client){
15-
Server::new_pair()
16+
pubfnsplit() ->(Server,Client){
17+
let(sender, receiver) = mpsc::channel(32);
18+
(Server{ receiver},Client{ sender})
1619
}
1720

1821
#[allow(async_fn_in_trait)]
1922
pubtraitFsOffload{
23+
asyncfnread(&self,path:PathBuf) -> io::Result<Vec<u8>>;
24+
asyncfnwrite(&self,path:PathBuf,content:Vec<u8>) -> io::Result<()>;
25+
asyncfnread_dir(&self,path:PathBuf) -> io::Result<ReadDir>;
26+
asyncfncreate_dir(&self,path:PathBuf) -> io::Result<()>;
27+
asyncfncreate_dir_all(&self,path:PathBuf) -> io::Result<()>;
28+
asyncfnremove_file(&self,path:PathBuf) -> io::Result<()>;
29+
asyncfnremove_dir(&self,path:PathBuf) -> io::Result<()>;
30+
asyncfnremove_dir_all(&self,path:PathBuf) -> io::Result<()>;
31+
asyncfnmetadata(&self,path:PathBuf) -> io::Result<Metadata>;
32+
}
33+
34+
pubstructFsOffloadDefault;
35+
36+
implFsOffloadforFsOffloadDefault{
2037
asyncfnread(&self,path:PathBuf) -> io::Result<Vec<u8>>{
2138
read(path).await
2239
}
40+
2341
asyncfnwrite(&self,path:PathBuf,content:Vec<u8>) -> io::Result<()>{
2442
write(path, content).await
2543
}
44+
2645
asyncfnread_dir(&self,path:PathBuf) -> io::Result<ReadDir>{
2746
read_dir(path).await
2847
}
48+
2949
asyncfncreate_dir(&self,path:PathBuf) -> io::Result<()>{
3050
create_dir(path).await
3151
}
52+
3253
asyncfncreate_dir_all(&self,path:PathBuf) -> io::Result<()>{
3354
create_dir_all(path).await
3455
}
56+
3557
asyncfnremove_file(&self,path:PathBuf) -> io::Result<()>{
3658
remove_file(path).await
3759
}
60+
3861
asyncfnremove_dir(&self,path:PathBuf) -> io::Result<()>{
3962
remove_dir(path).await
4063
}
64+
4165
asyncfnremove_dir_all(&self,path:PathBuf) -> io::Result<()>{
4266
remove_dir_all(path).await
4367
}
68+
4469
asyncfnmetadata(&self,path:PathBuf) -> io::Result<Metadata>{
4570
metadata(path).await
4671
}
4772
}
48-
49-
pubstructFsOffloadDefault;
50-
51-
implFsOffloadforFsOffloadDefault{}

‎src/fs/wasm/offload/server.rs‎

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,15 @@
11
use tokio::sync::mpsc;
22

3-
usesuper::{Client,FsOffload,FsTask};
3+
usesuper::{FsOffload,FsTask};
44

55
pubstructServer{
6-
receiver: mpsc::Receiver<FsTask>,
6+
pub(super)receiver: mpsc::Receiver<FsTask>,
77
}
88

99
implServer{
10-
pub(super)fnnew_pair() ->(Server,Client){
11-
let(sender, receiver) = mpsc::channel(32);
12-
(Server{ receiver},Client{ sender})
13-
}
14-
15-
pubasyncfnbind(mutself,offload:implFsOffload){
10+
pubasyncfnserve(mutself,offload:implFsOffload){
1611
whileletSome(task) =self.receiver.recv().await{
17-
match task{
18-
FsTask::Read{ path, sender} =>{
19-
let _ = sender.send(offload.read(path).await);
20-
}
21-
FsTask::Write{
22-
path,
23-
content,
24-
sender,
25-
} =>{
26-
let _ = sender.send(offload.write(path, content).await);
27-
}
28-
FsTask::ReadDir{ path, sender} =>{
29-
let _ = sender.send(offload.read_dir(path).await);
30-
}
31-
FsTask::CreateDir{ path, sender} =>{
32-
let _ = sender.send(offload.create_dir(path).await);
33-
}
34-
FsTask::CreateDirAll{ path, sender} =>{
35-
let _ = sender.send(offload.create_dir_all(path).await);
36-
}
37-
FsTask::RemoveFile{ path, sender} =>{
38-
let _ = sender.send(offload.remove_file(path).await);
39-
}
40-
FsTask::RemoveDir{ path, sender} =>{
41-
let _ = sender.send(offload.remove_dir(path).await);
42-
}
43-
FsTask::RemoveDirAll{ path, sender} =>{
44-
let _ = sender.send(offload.remove_dir_all(path).await);
45-
}
46-
FsTask::Metadata{ path, sender} =>{
47-
let _ = sender.send(offload.metadata(path).await);
48-
}
49-
}
12+
task.execute(&offload).await;
5013
}
5114
}
5215
}

‎src/fs/wasm/offload/task.rs‎

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{io, path::PathBuf};
22

33
use tokio::sync::oneshot;
44

5-
usesuper::{Metadata,ReadDir};
5+
usesuper::{FsOffload,Metadata,ReadDir};
66

77
pubenumFsTask{
88
Read{
@@ -43,3 +43,39 @@ pub enum FsTask {
4343
sender: oneshot::Sender<io::Result<Metadata>>,
4444
},
4545
}
46+
47+
macro_rules! impl_fs_task_execute{
48+
(
49+
$offload_trait:ident,
50+
$task_enum:ident,
51+
[ $(($variant:ident, $method:ident,( $( $arg:ident: $arg_type:ty),*))),*]
52+
) =>{
53+
impl $task_enum{
54+
pubasyncfn execute(self, offload:&impl $offload_trait){
55+
matchself{
56+
$(
57+
$task_enum::$variant{ $( $arg,)* sender} =>{
58+
let _ = sender.send(offload.$method( $( $arg),*).await);
59+
}
60+
)*
61+
}
62+
}
63+
}
64+
};
65+
}
66+
67+
impl_fs_task_execute!(
68+
FsOffload,
69+
FsTask,
70+
[
71+
(Read, read,(path:PathBuf)),
72+
(Write, write,(path:PathBuf, content:Vec<u8>)),
73+
(ReadDir, read_dir,(path:PathBuf)),
74+
(CreateDir, create_dir,(path:PathBuf)),
75+
(CreateDirAll, create_dir_all,(path:PathBuf)),
76+
(RemoveFile, remove_file,(path:PathBuf)),
77+
(RemoveDir, remove_dir,(path:PathBuf)),
78+
(RemoveDirAll, remove_dir_all,(path:PathBuf)),
79+
(Metadata, metadata,(path:PathBuf))
80+
]
81+
);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp