stdweb/webapi/
file_list.rs1use webcore::value::{Value, Reference};
2use webcore::try_from::TryInto;
3use webcore::reference_type::ReferenceType;
4use webapi::file::File;
5
6#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
13#[reference(instance_of = "FileList")]
14pub struct FileList( Reference );
15
16impl FileList {
17 pub fn len( &self ) -> u32 {
22 js!( return @{self}.length; ).try_into().unwrap()
23 }
24
25 pub fn iter( &self ) -> FileIter {
27 FileIter {
28 list: self.clone(),
29 index: 0
30 }
31 }
32}
33
34impl IntoIterator for FileList {
35 type Item = File;
36 type IntoIter = FileIter;
37
38 #[inline]
39 fn into_iter( self ) -> Self::IntoIter {
40 FileIter {
41 list: self,
42 index: 0
43 }
44 }
45}
46
47impl< 'a > IntoIterator for &'a FileList {
48 type Item = File;
49 type IntoIter = FileIter;
50
51 #[inline]
52 fn into_iter( self ) -> Self::IntoIter {
53 FileIter {
54 list: self.clone(),
55 index: 0
56 }
57 }
58}
59
60#[derive(Debug)]
61pub struct FileIter {
62 list: FileList,
63 index: i32
64}
65
66impl Iterator for FileIter {
67 type Item = File;
68 fn next( &mut self ) -> Option< Self::Item > {
69 let value = js!(
70 return @{&self.list}[ @{self.index} ];
71 );
72
73 let file = match value {
74 Value::Undefined => return None,
75 Value::Reference( reference ) => unsafe { File::from_reference_unchecked( reference ) },
76 _ => unreachable!()
77 };
78
79 self.index += 1;
80 Some( file )
81 }
82}