fix: should build with kxio dependency
This commit is contained in:
parent
97f794a36e
commit
ee426b1a43
4 changed files with 117 additions and 1 deletions
|
@ -4,4 +4,6 @@ version = "0.1.0"
|
|||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
kxio = "5.0"
|
||||
native-tls = { version = "0.2", features = ["vendored"] }
|
||||
tokio = { version = "1.43", features = ["full"] }
|
||||
|
|
3
justfile
3
justfile
|
@ -9,5 +9,8 @@ test: build
|
|||
clippy: build
|
||||
docker run --rm -v $PWD:/app/ {{ image }} cargo clippy
|
||||
|
||||
run: build
|
||||
docker run --rm -v $PWD:/app/ {{ image }} cargo run
|
||||
|
||||
shell: build
|
||||
docker run --rm -it -v $PWD:/app/ {{ image }} bash
|
||||
|
|
105
src/kxio.rs
Normal file
105
src/kxio.rs
Normal file
|
@ -0,0 +1,105 @@
|
|||
/// This is an example to show fetching a file from a webiste and saving to a file
|
||||
///
|
||||
/// The example consts of:
|
||||
///
|
||||
/// - The main program, in `main()` - demonstrates how to setup `kxio` for use in prod
|
||||
/// - A test module - demonstrates how to use `kxio` in tests
|
||||
/// - sample functions - showing how to use `kxio` the body of your program, and be testable
|
||||
///
|
||||
/// NOTE: running this program with `cargo run --example get` will create and delete the file
|
||||
/// `example-readme.md` in the current directory.
|
||||
use std::path::Path;
|
||||
|
||||
use kxio::fs::FileHandle;
|
||||
|
||||
// #[tokio::main]
|
||||
pub async fn main() -> kxio::Result<()> {
|
||||
// Create a `Net` object for making real network requests.
|
||||
let net: kxio::net::Net = kxio::net::new();
|
||||
|
||||
// Create a `FileSystem` object for accessing files within the current directory.
|
||||
// The object created will return a `PathTraveral` error result if there is an attempt to\
|
||||
// access a file outside of this directory.
|
||||
let current_dir = std::env::current_dir().map_err(kxio::fs::Error::Io)?;
|
||||
let fs: kxio::fs::FileSystem = kxio::fs::new(current_dir);
|
||||
|
||||
// The URL we will fetch - the readme for this library.
|
||||
let url = "https://git.kemitix.net/kemitix/kxio/raw/branch/main/README.md";
|
||||
|
||||
// Create a PathBuf to a file within the directory that the `fs` object has access to.
|
||||
let file_path = fs.base().join("example-readme.md");
|
||||
|
||||
// Create a generic handle for the file. This doesn't open the file, and always succeeds.
|
||||
let path = fs.path(&file_path);
|
||||
|
||||
// Other options are;
|
||||
// `fs.file(&file_path)` - for a file
|
||||
// `fs.dir(&dir_path)` - for a directory
|
||||
|
||||
// Checks if the path exists (whether a file, directory, etc)
|
||||
if path.exists()? {
|
||||
eprintln!("The file {path} already exists. Aborting!");
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// Passes a reference to the `fs` and `net` objects for use by your program.
|
||||
// Your programs should not know whether they are handling a mock or the real thing.
|
||||
// Any file or network access should be made using these handlers to be properly testable.
|
||||
let file = download_and_save_to_file(url, &file_path, &fs, &net).await?;
|
||||
read_file(&file)?;
|
||||
delete_file(file)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// An function that uses a `FileSystem` and a `Net` object to interact with the outside world.
|
||||
async fn download_and_save_to_file(
|
||||
url: &str,
|
||||
file_path: &Path,
|
||||
// The filesystem abstraction
|
||||
fs: &kxio::fs::FileSystem,
|
||||
// The network abstraction
|
||||
net: &kxio::net::Net,
|
||||
) -> kxio::Result<FileHandle> {
|
||||
println!("fetching: {url}");
|
||||
|
||||
// Makes a GET request that can be mocked in a test
|
||||
let response = net.get(url).header("key", "value").send().await?;
|
||||
|
||||
// As you can see, we use [reqwest] under the hood.
|
||||
//
|
||||
// If you need to create a more complex request than the [kxio] fluent API allows, you
|
||||
// can create a request using [reqwest] and pass it to [net.send(request)].
|
||||
|
||||
let body = response.text().await?;
|
||||
println!("fetched {} bytes", body.bytes().len());
|
||||
|
||||
// Uses the file system abstraction to create a handle for a file.
|
||||
let file: kxio::fs::PathReal<kxio::fs::FileMarker> = fs.file(file_path);
|
||||
println!("writing file: {file}");
|
||||
// Writes the body to the file.
|
||||
file.write(body)?;
|
||||
|
||||
Ok(file)
|
||||
}
|
||||
|
||||
/// A function that reads the file contents
|
||||
fn read_file(file: &FileHandle) -> kxio::Result<()> {
|
||||
println!("reading file: {file}");
|
||||
|
||||
// Creates a `Reader` which loaded the file into memory.
|
||||
let reader: kxio::fs::Reader = file.reader()?;
|
||||
let contents: &str = reader.as_str()?;
|
||||
println!("{contents}");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// A function that deletes the file
|
||||
fn delete_file(file: FileHandle) -> kxio::Result<()> {
|
||||
println!("deleting file: {file}");
|
||||
|
||||
file.remove()?;
|
||||
|
||||
Ok(())
|
||||
}
|
|
@ -1,7 +1,13 @@
|
|||
//
|
||||
mod kxio;
|
||||
mod tls;
|
||||
fn main() {
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
println!("Hello, world!");
|
||||
tls::main();
|
||||
|
||||
let rt = tokio::runtime::Runtime::new()?;
|
||||
Ok(rt.block_on(crate::kxio::main())?)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
|
Loading…
Add table
Reference in a new issue