use std::fmt::Debug;
use clap::{arg, Parser};
pub use data::{StorageProvider, PatterApi, SafeStorage};
use api::data::PinnedObject;
use errors::*;
pub use providers::{web3_storage::Web3StorageProvider, pinata::PinataProvider};
use crate::api::data::PinByHashResult;
use crate::data::{PinFileData, PinHashData, PinJsonData};
mod utils;
mod api;
mod data;
mod errors;
pub mod providers;
#[allow(unused_variables)]
#[derive(Parser, Debug)]
#[clap(author="Patter", about="A rust library for pinning data to ipfs")]
pub struct Args {
#[arg(short, long)]
pub action: String,
#[arg(short, long)]
pub provider: Option<String>,
#[arg(short, long)]
pub file_path: Option<String>,
#[arg(long)]
pub hash: Option<String>,
}
pub async fn run(args: Args) -> Result<(), &'static str> {
let providers: Vec<Box<dyn StorageProvider + Send + Sync>> = if let Some(provider) = args.provider {
match provider.as_str() {
"pinata" => {
vec![Box::new(PinataProvider::new(None, None).unwrap()) as SafeStorage]
}
"web3" => {
vec![Box::new(Web3StorageProvider::new(None).unwrap()) as SafeStorage]
}
_ => {
panic!("Unsupported provider");
}
}
} else {
vec![Box::new(PinataProvider::new(None, None).unwrap()) as SafeStorage, Box::new(Web3StorageProvider::new(None).unwrap()) as SafeStorage]
};
let names = providers.iter().map(|p| p.name()).collect::<Vec<String>>();
println!("Uploading to the providers: {:?}", names);
if providers.len() == 0 {
return Err("No Valid provider");
}
match args.action.as_str() {
"pin_file" => {
println!("pin files");
let patter_api = PatterApi::new();
let result: Result<Vec<PinnedObject>, ApiError> = patter_api.pin_file(PinFileData { files: vec![args.file_path.unwrap()], providers }).await;
println!("[patter_api.pin_file]:: {:?}", result.unwrap());
}
"pin_json" => {
println!("pin json");
let patter_api = PatterApi::new();
let result: Result<Vec<PinnedObject>, ApiError> = patter_api.pin_json(PinJsonData { file: args.file_path.unwrap(), providers }).await;
println!("[patter_api.pin_json]:: {:?}", result.unwrap());
}
"pin_hash" => {
println!("....pin hash....");
let patter_api = PatterApi::new();
let result: Result<Vec<PinByHashResult>, ApiError> = patter_api.pin_by_hash(PinHashData { hash: args.hash.unwrap(), providers }).await;
println!("[patter_api.pin_hash]:: {:?}", result.unwrap());
}
"unpin" => {
println!("....removing cid....");
let patter_api = PatterApi::new();
let result: Result<(), ApiError> = patter_api.unpin(PinHashData { hash: args.hash.unwrap(), providers }).await;
println!("[patter_api.unpin]:: {:?}", result.unwrap());
}
_ => {
panic!("Specify what you want to do.\n \
use `--action pin_file` to pin a file\n
")
}
};
Ok(())
}
#[cfg(test)]
mod tests;