1extern crate futures;
62extern crate tokio_fs;
63
64use std::{fs::{Metadata, Permissions}, io::{Error, SeekFrom}};
65use futures::{Async, Future, Poll};
66
67pub trait AsyncFile: Sized {
69 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error>;
70 fn poll_sync_all(&mut self) -> Poll<(), Error>;
71 fn poll_sync_data(&mut self) -> Poll<(), Error>;
72 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error>;
73 fn poll_metadata(&mut self) -> Poll<Metadata, Error>;
74 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error>;
75 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error>;
76
77 fn seek(self, pos: SeekFrom) -> Seek<Self> {
78 Seek {
79 pos,
80 inner: Some(self),
81 }
82 }
83
84 fn sync_all(self) -> SyncAll<Self> {
85 SyncAll { inner: Some(self) }
86 }
87
88 fn sync_data(self) -> SyncData<Self> {
89 SyncData { inner: Some(self) }
90 }
91
92 fn set_len(self, size: u64) -> SetLen<Self> {
93 SetLen {
94 size,
95 inner: Some(self),
96 }
97 }
98
99 fn metadata(self) -> GetMetadata<Self> {
100 GetMetadata { inner: Some(self) }
101 }
102
103 fn try_clone(self) -> TryClone<Self> {
104 TryClone { inner: Some(self) }
105 }
106
107 fn set_permissions(self, perm: Permissions) -> SetPermissions<Self> {
108 SetPermissions {
109 perm,
110 inner: Some(self),
111 }
112 }
113}
114
115impl AsyncFile for tokio_fs::file::File {
116 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error> {
117 tokio_fs::file::File::poll_seek(self, pos)
118 }
119
120 fn poll_sync_all(&mut self) -> Poll<(), Error> {
121 tokio_fs::file::File::poll_sync_all(self)
122 }
123
124 fn poll_sync_data(&mut self) -> Poll<(), Error> {
125 tokio_fs::file::File::poll_sync_data(self)
126 }
127
128 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error> {
129 tokio_fs::file::File::poll_set_len(self, size)
130 }
131
132 fn poll_metadata(&mut self) -> Poll<Metadata, Error> {
133 tokio_fs::file::File::poll_metadata(self)
134 }
135
136 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error> {
137 tokio_fs::file::File::poll_try_clone(self)
138 }
139
140 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error> {
141 tokio_fs::file::File::poll_set_permissions(self, perm)
142 }
143}
144
145pub struct Seek<T> {
146 pos: SeekFrom,
147 inner: Option<T>,
148}
149
150impl<T> Future for Seek<T>
151where
152 T: AsyncFile,
153{
154 type Item = (T, u64);
155 type Error = Error;
156
157 fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
158 let mut inner = self.inner.take().unwrap();
159
160 match inner.poll_seek(self.pos) {
161 Ok(Async::Ready(seek)) => Ok(Async::Ready((inner, seek))),
162 Ok(_) => Ok(Async::NotReady),
163 Err(e) => Err(e),
164 }
165 }
166}
167
168impl<T> AsyncFile for Seek<T>
169where
170 T: AsyncFile,
171{
172 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error> {
173 let mut inner = self.inner.take().unwrap();
174
175 let res = inner.poll_seek(pos);
176 self.inner = Some(inner);
177
178 res
179 }
180
181 fn poll_sync_all(&mut self) -> Poll<(), Error> {
182 let mut inner = self.inner.take().unwrap();
183
184 let res = inner.poll_sync_all();
185 self.inner = Some(inner);
186
187 res
188 }
189
190 fn poll_sync_data(&mut self) -> Poll<(), Error> {
191 let mut inner = self.inner.take().unwrap();
192
193 let res = inner.poll_sync_data();
194 self.inner = Some(inner);
195
196 res
197 }
198
199 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error> {
200 let mut inner = self.inner.take().unwrap();
201
202 let res = inner.poll_set_len(size);
203 self.inner = Some(inner);
204
205 res
206 }
207
208 fn poll_metadata(&mut self) -> Poll<Metadata, Error> {
209 let mut inner = self.inner.take().unwrap();
210
211 let res = inner.poll_metadata();
212 self.inner = Some(inner);
213
214 res
215 }
216
217 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error> {
218 let mut inner = self.inner.take().unwrap();
219
220 let res = inner.poll_try_clone();
221 self.inner = Some(inner);
222
223 res
224 }
225
226 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error> {
227 let mut inner = self.inner.take().unwrap();
228
229 let res = inner.poll_set_permissions(perm);
230 self.inner = Some(inner);
231
232 res
233 }
234}
235
236pub struct SyncAll<T> {
237 inner: Option<T>,
238}
239
240impl<T> Future for SyncAll<T>
241where
242 T: AsyncFile,
243{
244 type Item = T;
245 type Error = Error;
246
247 fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
248 let mut inner = self.inner.take().unwrap();
249
250 match inner.poll_sync_all() {
251 Ok(Async::Ready(())) => Ok(Async::Ready(inner)),
252 Ok(_) => Ok(Async::NotReady),
253 Err(e) => Err(e),
254 }
255 }
256}
257
258impl<T> AsyncFile for SyncAll<T>
259where
260 T: AsyncFile,
261{
262 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error> {
263 let mut inner = self.inner.take().unwrap();
264
265 let res = inner.poll_seek(pos);
266 self.inner = Some(inner);
267
268 res
269 }
270
271 fn poll_sync_all(&mut self) -> Poll<(), Error> {
272 let mut inner = self.inner.take().unwrap();
273
274 let res = inner.poll_sync_all();
275 self.inner = Some(inner);
276
277 res
278 }
279
280 fn poll_sync_data(&mut self) -> Poll<(), Error> {
281 let mut inner = self.inner.take().unwrap();
282
283 let res = inner.poll_sync_data();
284 self.inner = Some(inner);
285
286 res
287 }
288
289 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error> {
290 let mut inner = self.inner.take().unwrap();
291
292 let res = inner.poll_set_len(size);
293 self.inner = Some(inner);
294
295 res
296 }
297
298 fn poll_metadata(&mut self) -> Poll<Metadata, Error> {
299 let mut inner = self.inner.take().unwrap();
300
301 let res = inner.poll_metadata();
302 self.inner = Some(inner);
303
304 res
305 }
306
307 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error> {
308 let mut inner = self.inner.take().unwrap();
309
310 let res = inner.poll_try_clone();
311 self.inner = Some(inner);
312
313 res
314 }
315
316 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error> {
317 let mut inner = self.inner.take().unwrap();
318
319 let res = inner.poll_set_permissions(perm);
320 self.inner = Some(inner);
321
322 res
323 }
324}
325
326pub struct SyncData<T> {
327 inner: Option<T>,
328}
329
330impl<T> Future for SyncData<T>
331where
332 T: AsyncFile,
333{
334 type Item = T;
335 type Error = Error;
336
337 fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
338 let mut inner = self.inner.take().unwrap();
339
340 match inner.poll_sync_all() {
341 Ok(Async::Ready(())) => Ok(Async::Ready(inner)),
342 Ok(_) => Ok(Async::NotReady),
343 Err(e) => Err(e),
344 }
345 }
346}
347
348impl<T> AsyncFile for SyncData<T>
349where
350 T: AsyncFile,
351{
352 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error> {
353 let mut inner = self.inner.take().unwrap();
354
355 let res = inner.poll_seek(pos);
356 self.inner = Some(inner);
357
358 res
359 }
360
361 fn poll_sync_all(&mut self) -> Poll<(), Error> {
362 let mut inner = self.inner.take().unwrap();
363
364 let res = inner.poll_sync_all();
365 self.inner = Some(inner);
366
367 res
368 }
369
370 fn poll_sync_data(&mut self) -> Poll<(), Error> {
371 let mut inner = self.inner.take().unwrap();
372
373 let res = inner.poll_sync_data();
374 self.inner = Some(inner);
375
376 res
377 }
378
379 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error> {
380 let mut inner = self.inner.take().unwrap();
381
382 let res = inner.poll_set_len(size);
383 self.inner = Some(inner);
384
385 res
386 }
387
388 fn poll_metadata(&mut self) -> Poll<Metadata, Error> {
389 let mut inner = self.inner.take().unwrap();
390
391 let res = inner.poll_metadata();
392 self.inner = Some(inner);
393
394 res
395 }
396
397 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error> {
398 let mut inner = self.inner.take().unwrap();
399
400 let res = inner.poll_try_clone();
401 self.inner = Some(inner);
402
403 res
404 }
405
406 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error> {
407 let mut inner = self.inner.take().unwrap();
408
409 let res = inner.poll_set_permissions(perm);
410 self.inner = Some(inner);
411
412 res
413 }
414}
415
416pub struct SetLen<T> {
417 size: u64,
418 inner: Option<T>,
419}
420
421impl<T> Future for SetLen<T>
422where
423 T: AsyncFile,
424{
425 type Item = T;
426 type Error = Error;
427
428 fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
429 let mut inner = self.inner.take().unwrap();
430
431 match inner.poll_set_len(self.size) {
432 Ok(Async::Ready(())) => Ok(Async::Ready(inner)),
433 Ok(_) => Ok(Async::NotReady),
434 Err(e) => Err(e),
435 }
436 }
437}
438
439impl<T> AsyncFile for SetLen<T>
440where
441 T: AsyncFile,
442{
443 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error> {
444 let mut inner = self.inner.take().unwrap();
445
446 let res = inner.poll_seek(pos);
447 self.inner = Some(inner);
448
449 res
450 }
451
452 fn poll_sync_all(&mut self) -> Poll<(), Error> {
453 let mut inner = self.inner.take().unwrap();
454
455 let res = inner.poll_sync_all();
456 self.inner = Some(inner);
457
458 res
459 }
460
461 fn poll_sync_data(&mut self) -> Poll<(), Error> {
462 let mut inner = self.inner.take().unwrap();
463
464 let res = inner.poll_sync_data();
465 self.inner = Some(inner);
466
467 res
468 }
469
470 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error> {
471 let mut inner = self.inner.take().unwrap();
472
473 let res = inner.poll_set_len(size);
474 self.inner = Some(inner);
475
476 res
477 }
478
479 fn poll_metadata(&mut self) -> Poll<Metadata, Error> {
480 let mut inner = self.inner.take().unwrap();
481
482 let res = inner.poll_metadata();
483 self.inner = Some(inner);
484
485 res
486 }
487
488 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error> {
489 let mut inner = self.inner.take().unwrap();
490
491 let res = inner.poll_try_clone();
492 self.inner = Some(inner);
493
494 res
495 }
496
497 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error> {
498 let mut inner = self.inner.take().unwrap();
499
500 let res = inner.poll_set_permissions(perm);
501 self.inner = Some(inner);
502
503 res
504 }
505}
506
507pub struct GetMetadata<T> {
508 inner: Option<T>,
509}
510
511impl<T> Future for GetMetadata<T>
512where
513 T: AsyncFile,
514{
515 type Item = (T, Metadata);
516 type Error = Error;
517
518 fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
519 let mut inner = self.inner.take().unwrap();
520
521 match inner.poll_metadata() {
522 Ok(Async::Ready(metadata)) => Ok(Async::Ready((inner, metadata))),
523 Ok(_) => Ok(Async::NotReady),
524 Err(e) => Err(e),
525 }
526 }
527}
528
529impl<T> AsyncFile for GetMetadata<T>
530where
531 T: AsyncFile,
532{
533 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error> {
534 let mut inner = self.inner.take().unwrap();
535
536 let res = inner.poll_seek(pos);
537 self.inner = Some(inner);
538
539 res
540 }
541
542 fn poll_sync_all(&mut self) -> Poll<(), Error> {
543 let mut inner = self.inner.take().unwrap();
544
545 let res = inner.poll_sync_all();
546 self.inner = Some(inner);
547
548 res
549 }
550
551 fn poll_sync_data(&mut self) -> Poll<(), Error> {
552 let mut inner = self.inner.take().unwrap();
553
554 let res = inner.poll_sync_data();
555 self.inner = Some(inner);
556
557 res
558 }
559
560 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error> {
561 let mut inner = self.inner.take().unwrap();
562
563 let res = inner.poll_set_len(size);
564 self.inner = Some(inner);
565
566 res
567 }
568
569 fn poll_metadata(&mut self) -> Poll<Metadata, Error> {
570 let mut inner = self.inner.take().unwrap();
571
572 let res = inner.poll_metadata();
573 self.inner = Some(inner);
574
575 res
576 }
577
578 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error> {
579 let mut inner = self.inner.take().unwrap();
580
581 let res = inner.poll_try_clone();
582 self.inner = Some(inner);
583
584 res
585 }
586
587 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error> {
588 let mut inner = self.inner.take().unwrap();
589
590 let res = inner.poll_set_permissions(perm);
591 self.inner = Some(inner);
592
593 res
594 }
595}
596
597pub struct TryClone<T> {
598 inner: Option<T>,
599}
600
601impl<T> Future for TryClone<T>
602where
603 T: AsyncFile,
604{
605 type Item = (T, tokio_fs::file::File);
606 type Error = Error;
607
608 fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
609 let mut inner = self.inner.take().unwrap();
610
611 match inner.poll_try_clone() {
612 Ok(Async::Ready(file)) => Ok(Async::Ready((inner, file))),
613 Ok(_) => Ok(Async::NotReady),
614 Err(e) => Err(e),
615 }
616 }
617}
618
619impl<T> AsyncFile for TryClone<T>
620where
621 T: AsyncFile,
622{
623 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error> {
624 let mut inner = self.inner.take().unwrap();
625
626 let res = inner.poll_seek(pos);
627 self.inner = Some(inner);
628
629 res
630 }
631
632 fn poll_sync_all(&mut self) -> Poll<(), Error> {
633 let mut inner = self.inner.take().unwrap();
634
635 let res = inner.poll_sync_all();
636 self.inner = Some(inner);
637
638 res
639 }
640
641 fn poll_sync_data(&mut self) -> Poll<(), Error> {
642 let mut inner = self.inner.take().unwrap();
643
644 let res = inner.poll_sync_data();
645 self.inner = Some(inner);
646
647 res
648 }
649
650 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error> {
651 let mut inner = self.inner.take().unwrap();
652
653 let res = inner.poll_set_len(size);
654 self.inner = Some(inner);
655
656 res
657 }
658
659 fn poll_metadata(&mut self) -> Poll<Metadata, Error> {
660 let mut inner = self.inner.take().unwrap();
661
662 let res = inner.poll_metadata();
663 self.inner = Some(inner);
664
665 res
666 }
667
668 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error> {
669 let mut inner = self.inner.take().unwrap();
670
671 let res = inner.poll_try_clone();
672 self.inner = Some(inner);
673
674 res
675 }
676
677 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error> {
678 let mut inner = self.inner.take().unwrap();
679
680 let res = inner.poll_set_permissions(perm);
681 self.inner = Some(inner);
682
683 res
684 }
685}
686
687pub struct SetPermissions<T> {
688 perm: Permissions,
689 inner: Option<T>,
690}
691
692impl<T> Future for SetPermissions<T>
693where
694 T: AsyncFile,
695{
696 type Item = T;
697 type Error = Error;
698
699 fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
700 let mut inner = self.inner.take().unwrap();
701
702 match inner.poll_set_permissions(self.perm.clone()) {
703 Ok(Async::Ready(())) => Ok(Async::Ready(inner)),
704 Ok(_) => Ok(Async::NotReady),
705 Err(e) => Err(e),
706 }
707 }
708}
709
710impl<T> AsyncFile for SetPermissions<T>
711where
712 T: AsyncFile,
713{
714 fn poll_seek(&mut self, pos: SeekFrom) -> Poll<u64, Error> {
715 let mut inner = self.inner.take().unwrap();
716
717 let res = inner.poll_seek(pos);
718 self.inner = Some(inner);
719
720 res
721 }
722
723 fn poll_sync_all(&mut self) -> Poll<(), Error> {
724 let mut inner = self.inner.take().unwrap();
725
726 let res = inner.poll_sync_all();
727 self.inner = Some(inner);
728
729 res
730 }
731
732 fn poll_sync_data(&mut self) -> Poll<(), Error> {
733 let mut inner = self.inner.take().unwrap();
734
735 let res = inner.poll_sync_data();
736 self.inner = Some(inner);
737
738 res
739 }
740
741 fn poll_set_len(&mut self, size: u64) -> Poll<(), Error> {
742 let mut inner = self.inner.take().unwrap();
743
744 let res = inner.poll_set_len(size);
745 self.inner = Some(inner);
746
747 res
748 }
749
750 fn poll_metadata(&mut self) -> Poll<Metadata, Error> {
751 let mut inner = self.inner.take().unwrap();
752
753 let res = inner.poll_metadata();
754 self.inner = Some(inner);
755
756 res
757 }
758
759 fn poll_try_clone(&mut self) -> Poll<tokio_fs::file::File, Error> {
760 let mut inner = self.inner.take().unwrap();
761
762 let res = inner.poll_try_clone();
763 self.inner = Some(inner);
764
765 res
766 }
767
768 fn poll_set_permissions(&mut self, perm: Permissions) -> Poll<(), Error> {
769 let mut inner = self.inner.take().unwrap();
770
771 let res = inner.poll_set_permissions(perm);
772 self.inner = Some(inner);
773
774 res
775 }
776}