use std::path::Path;
use kxio::fs::FileHandle;
#[tokio::main]
async fn main() -> kxio::Result<()> {
let net: kxio::net::Net = kxio::net::new();
let current_dir = std::env::current_dir().map_err(kxio::fs::Error::Io)?;
let fs: kxio::fs::FileSystem = kxio::fs::new(current_dir);
let url = "https://git.kemitix.net/kemitix/kxio/raw/branch/main/README.md";
let file_path = fs.base().join("example-readme.md");
let path = fs.path(&file_path);
if path.exists()? {
eprintln!("The file {path} already exists. Aborting!");
return Ok(());
}
let file = download_and_save_to_file(url, &file_path, &fs, &net).await?;
read_file(&file)?;
delete_file(file)?;
Ok(())
}
async fn download_and_save_to_file(
url: &str,
file_path: &Path,
fs: &kxio::fs::FileSystem,
net: &kxio::net::Net,
) -> kxio::Result<FileHandle> {
println!("fetching: {url}");
let response: reqwest::Response = net.get(url).header("key", "value").send().await?;
let body = response.text().await?;
println!("fetched {} bytes", body.bytes().len());
let file: kxio::fs::PathReal<kxio::fs::FileMarker> = fs.file(file_path);
println!("writing file: {file}");
file.write(body)?;
Ok(file)
}
fn read_file(file: &FileHandle) -> kxio::Result<()> {
println!("reading file: {file}");
let reader: kxio::fs::Reader = file.reader()?;
let contents: &str = reader.as_str();
println!("{contents}");
Ok(())
}
fn delete_file(file: FileHandle) -> kxio::Result<()> {
println!("deleting file: {file}");
file.remove()?;
Ok(())
}
#[cfg(test)]
mod tests {
use http::StatusCode;
use super::*;
#[tokio::test]
async fn should_save_remote_body() {
let mock_net: kxio::net::MockNet = kxio::net::mock();
let url = "http://localhost:8080";
mock_net
.on()
.get(url)
.respond(StatusCode::OK)
.body("contents")
.expect("valid mock");
let fs = kxio::fs::temp().expect("temp fs");
let file_path = fs.base().join("foo");
let net = kxio::net::Net::from(mock_net);
download_and_save_to_file(url, &file_path, &fs, &net)
.await
.expect("system under test");
let file = fs.file(&file_path);
let reader = file.reader().expect("reader");
let contents = reader.as_str();
assert_eq!(contents, "contents");
}
}