Compare commits
2 commits
2dab3c9ecd
...
2f4c6b73aa
| Author | SHA1 | Date | |
|---|---|---|---|
| 2f4c6b73aa | |||
| 763c8f689e |
3 changed files with 34 additions and 25 deletions
38
src/cli.rs
38
src/cli.rs
|
|
@ -1,24 +1,30 @@
|
||||||
use std::path::PathBuf;
|
use std::time::Duration;
|
||||||
|
|
||||||
use clap::{Parser, builder::PossibleValuesParser};
|
use clap::{Parser, builder::PossibleValuesParser};
|
||||||
|
|
||||||
|
use super::sharry::File;
|
||||||
|
|
||||||
#[derive(Parser, Debug, Hash)]
|
#[derive(Parser, Debug, Hash)]
|
||||||
#[command(version, about, long_about = None)]
|
#[command(version, about, long_about = None)]
|
||||||
pub struct Cli {
|
pub struct Cli {
|
||||||
/// Timeout in seconds for HTTP actions
|
/// Timeout in seconds for HTTP actions (set 0 or invalid to disable)
|
||||||
#[arg(short, long, value_name = "SECS")]
|
#[arg(
|
||||||
pub timeout: Option<u64>,
|
short, long,
|
||||||
|
default_value = "10", value_name = "SECS",
|
||||||
|
value_parser = parse_seconds,
|
||||||
|
)]
|
||||||
|
timeout: Duration,
|
||||||
|
|
||||||
/// Protocol for Sharry instance
|
/// Protocol for Sharry instance
|
||||||
#[arg(
|
#[arg(
|
||||||
short, long,
|
short, long,
|
||||||
default_value = "https", value_name = "VARIANT",
|
default_value = "https", value_name = "VARIANT",
|
||||||
value_parser = PossibleValuesParser::new(["http", "https"])
|
value_parser = PossibleValuesParser::new(["http", "https"]),
|
||||||
)]
|
)]
|
||||||
pub protocol: String,
|
pub protocol: String,
|
||||||
|
|
||||||
/// Name of the new share
|
/// Name of the new share
|
||||||
#[arg(short, long, default_value = "shrupl upload", value_name = "TEXT")]
|
#[arg(short, long, default_value = "ShrUpl Upload", value_name = "TEXT")]
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
|
||||||
/// Description of the new share
|
/// Description of the new share
|
||||||
|
|
@ -26,7 +32,7 @@ pub struct Cli {
|
||||||
pub description: Option<String>,
|
pub description: Option<String>,
|
||||||
|
|
||||||
/// Maximum number of views for the new share
|
/// Maximum number of views for the new share
|
||||||
#[arg(short, long, default_value_t = 10, value_name = "N")]
|
#[arg(short, long, default_value_t = 100, value_name = "N")]
|
||||||
pub max_views: u32,
|
pub max_views: u32,
|
||||||
|
|
||||||
/// Chunk size for uploading, in MiB
|
/// Chunk size for uploading, in MiB
|
||||||
|
|
@ -40,6 +46,20 @@ pub struct Cli {
|
||||||
pub alias: String,
|
pub alias: String,
|
||||||
|
|
||||||
/// Files to upload to the new share
|
/// Files to upload to the new share
|
||||||
#[arg(value_name = "FILE")]
|
#[arg(value_name = "FILE", required = true, value_parser = parse_sharry_file)]
|
||||||
pub files: Vec<PathBuf>,
|
pub files: Vec<File>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_seconds(data: &str) -> Result<Duration, String> {
|
||||||
|
data.parse().or(Ok(0)).map(Duration::from_secs)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_sharry_file(data: &str) -> Result<File, String> {
|
||||||
|
File::new(data).map_err(|e| e.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Cli {
|
||||||
|
pub fn get_timeout(&self) -> Option<Duration> {
|
||||||
|
(!self.timeout.is_zero()).then(|| self.timeout)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
19
src/main.rs
19
src/main.rs
|
|
@ -1,43 +1,32 @@
|
||||||
mod cli;
|
mod cli;
|
||||||
mod sharry;
|
mod sharry;
|
||||||
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use log::{error, info};
|
use log::{error, info};
|
||||||
use ureq::Agent;
|
use ureq::Agent;
|
||||||
|
|
||||||
use cli::Cli;
|
use cli::Cli;
|
||||||
use sharry::{Alias, File, NewShareRequest, Share, Uri};
|
use sharry::{Alias, NewShareRequest, Share, Uri};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
|
|
||||||
let args = Cli::parse();
|
let args = Cli::parse();
|
||||||
info!("args: {args:?}");
|
info!("args: {args:?}");
|
||||||
|
info!("timeout: {:?}", args.get_timeout());
|
||||||
|
|
||||||
let agent: Agent = Agent::config_builder()
|
let agent: Agent = Agent::config_builder()
|
||||||
.timeout_global(args.timeout.map(Duration::from_secs))
|
.timeout_global(args.get_timeout())
|
||||||
.build()
|
.build()
|
||||||
.into();
|
.into();
|
||||||
|
|
||||||
let files: Vec<File> = (args.files.iter())
|
|
||||||
.filter(|&p| p.exists())
|
|
||||||
.map(File::new)
|
|
||||||
.map(Result::unwrap)
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
if files.is_empty() {
|
|
||||||
panic!("NO FILES GIVEN");
|
|
||||||
}
|
|
||||||
|
|
||||||
let alias = Alias::new(Uri::with_protocol(args.protocol, args.url), args.alias);
|
let alias = Alias::new(Uri::with_protocol(args.protocol, args.url), args.alias);
|
||||||
|
|
||||||
let share = NewShareRequest::new(args.name, args.description, args.max_views);
|
let share = NewShareRequest::new(args.name, args.description, args.max_views);
|
||||||
let share = Share::create(&agent, &alias, share).unwrap();
|
let share = Share::create(&agent, &alias, share).unwrap();
|
||||||
info!("share: {share:?}");
|
info!("share: {share:?}");
|
||||||
|
|
||||||
for file in files {
|
for file in args.files {
|
||||||
let file = file.create(&agent, &share).unwrap();
|
let file = file.create(&agent, &share).unwrap();
|
||||||
info!("file: {file:?}");
|
info!("file: {file:?}");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ use super::{
|
||||||
};
|
};
|
||||||
pub use chunks::{Chunk, FileChunks};
|
pub use chunks::{Chunk, FileChunks};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone, Hash)]
|
||||||
pub struct File {
|
pub struct File {
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
name: String,
|
name: String,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue