1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
//! A file abstraction system for Rust
//!
//! Chicon is a library intends to provide a simple,
//! uniform and universal API interacting with any filesystem,
//! as an abstraction layer providing traits, types and methods.
//! otherwise link to an installed copy.
//!
//! The main `FileSystem` trait is based on the usage of `std::fs::*`
//! in order to be transparent when you want to switch from a physical filesystem
//! to a virtual filesystem like S3, SFTP, SSH, in-memory.
//!
//! Memory file system can be appropriate when you write your tests in order to have faster behavior than an IO filesystem.
//!
//! It is suitable for any situation when you need to store directories and files
//! on different filesystems.
//!
//! # Examples
//!
//! ## Use S3 as backend to create a file
//!
//! ```should_panic
//! use std::io::prelude::*;
//!
//! use chicon::{DirEntry, File, FileSystem, S3FileSystem};
//!
//! let s3_fs = S3FileSystem::new(
//! String::from("my_access_key_id"),
//! String::from("secret_access_key"),
//! String::from("my_bucket"),
//! String::from("my_region"),
//! String::from("http://127.0.0.1"), // endpoint
//! );
//! let mut file = s3_fs.create_file("test.test").unwrap()
//!
//! file.write_all(String::from("here is a test").as_bytes()).unwrap();
//! file.sync_all().unwrap();
//!
//! let mut content: String = String::new();
//! file.read_to_string(&mut content).unwrap();
//! assert_eq!(content, String::from("here is a test"));
//!
//! s3_fs.remove_file("test.test").unwrap(); // If you want to delete the file
//! ```
//!
//! ## Use SFTP as backend to create a file
//!
//! You just need to change from `S3FileSystem::new` to `SFTPFileSystem::new`.
//!
//! ```should_panic
//! use std::io::prelude::*;
//!
//! use chicon::{DirEntry, File, FileSystem, SFTPFileSystem};
//!
//! let sftp_fs = SFTPFileSystem::new(
//! String::from("127.0.0.1:2222"), // host:port
//! String::from("foo"), // user
//! None, // Some("passphrase") if you have a passphrase configured on your ssh key
//! "/Users/foo/.ssh/my_private_key", // ABSOLUTE path to private key
//! "/Users/foo/.ssh/my_public_key.pub" // ABSOLUTE path to public key
//! );
//! let mut file = sftp_fs.create_file("test.test").unwrap()
//!
//! file.write_all(String::from("here is a test").as_bytes()).unwrap();
//! file.sync_all().unwrap();
//!
//! let mut content: String = String::new();
//! file.read_to_string(&mut content).unwrap();
//! assert_eq!(content, String::from("here is a test"));
//!
//! ```
//!
//! ## Use SSH as backend to read a file
//!
//! ```should_panic
//! use std::io::prelude::*;
//!
//! use chicon::{DirEntry, File, FileSystem, SSHFileSystem};
//!
//! let ssh_fs = SSHFileSystem::new(
//! String::from("127.0.0.1:2222"), // host:port
//! String::from("foo"), // user
//! None, // Some("passphrase") if you have a passphrase configured on your ssh key
//! "/Users/foo/.ssh/my_private_key", // ABSOLUTE path to private key
//! "/Users/foo/.ssh/my_public_key.pub" // ABSOLUTE path to public key
//! );
//! let mut file = ssh_fs.open_file("share/myfile.txt").unwrap();
//! let mut buffer = String::new();
//! file.read_to_string(&mut buffer).unwrap();
//!
//! println!("Here is the content of your file: {}", buffer);
//! ```
//!
//!
//! ## Use OS (local filesystem) as backend to create and read a directory
//!
//! ```should_panic
//! use std::io::prelude::*;
//!
//! use chicon::{DirEntry, File, FileType, FileSystem, OsFileSystem};
//!
//! let os_fs = OsFileSystem::new();
//! os_fs.create_dir_all("testreaddir/test").unwrap();
//! os_fs.create_file("testreaddir/mytest.test").unwrap();
//!
//! let dir_entries = os_fs.read_dir("testreaddir").unwrap();
//! assert!(!dir_entries.is_empty())
//! assert_eq!(dir_entries.len(), 2)
//! assert_eq!(
//! dir_entries.get(0).unwrap().path().unwrap(),
//! PathBuf::from("testreaddir/test")
//! );
//! assert_eq!(
//! dir_entries.get(0).unwrap().file_type().unwrap(),
//! FileType::Directory
//! );
//!
//! std::fs::remove_dir_all("testreaddir").unwrap(); // If you want to remove dir and all entries inside
//! ```
//!
//! If you need more examples, check-out all tests in the source code on GitHub
//!
extern crate rusoto_core;
extern crate rusoto_s3;
extern crate ssh2;
extern crate url;
extern crate chrono;
extern crate env_logger;
extern crate osauth;
extern crate serde;
extern crate tokio;
extern crate failure;
// mod swift;
use Permissions;
use ;
use ;
pub use ChiconError;
pub use *;
pub use *;
pub use ;
pub use *;
pub use *;
///
/// The FileSystem trait needs to be implemented if you want a fully available abstract filesystem.
/// For now we have few implementations as OSFileSystem, S3FileSystem, SFTPFileSystem, SSHFileSystem, MemFileSystem
///
/// Trait that represent a file inside our FileSystem. Associated type `File` in our `FileSystem` trait must implement this trait.
/// Trait that represent a directory entry inside our FileSystem. Associated type `DirEntry` in our `FileSystem` trait must implement this trait.
/// Possible file type when you fetch directory entries