Expand description
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
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
.
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
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
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
Structs
FileSystem
trait to store on an in memory filesystemDirEntry
trait to represent an entry in a directory on a local filesystemFileSystem
trait to store on a local filesystemDirEntry
trait to represent an entry in a directory on an Amazon S3 API compliantFile
trait to represent a file on an Amazon S3 API compliantFileSystem
trait to store on an Amazon S3 API compliantDirEntry
trait to represent an entry in a directory on a SFTP serverFile
trait to represent a file on a SFTP serverFileSystem
trait to store on a SFTP serverDirEntry
trait to represent an entry in a directory on a SSH serverFile
trait to represent a file on a SSH server (via scp)FileSystem
trait to store on a SSH server (via scp)Enums
DirEntry
trait to represent an entry in a directory on an in memory filesystemTraits
DirEntry
in our FileSystem
trait must implement this trait.File
in our FileSystem
trait must implement this trait.