use clap::Parser;
use lfspull::prelude::*;
use std::path::PathBuf;
use tracing::{info, Level};
use tracing_subscriber::FmtSubscriber;
#[derive(Parser)]
#[clap(about, long_about = None)]
struct Args {
#[clap(short, long)]
file_to_pull: Option<PathBuf>,
#[clap(short, long, env = "ACCESS_TOKEN")]
access_token: Option<String>,
#[clap(short, long)]
recurse_pattern: Option<String>,
#[clap(short = 'b', long)]
random_bytes: Option<usize>,
#[clap(short, long, default_value_t = 3)]
max_retry: u32,
#[clap(short, long)]
verbose: bool,
#[clap(short, long)]
timeout: Option<u64>,
}
#[tokio::main]
pub async fn main() -> Result<(), LFSError> {
let _ = enable_ansi_support::enable_ansi_support();
let args = Args::parse();
let level = if args.verbose {
Level::TRACE
} else {
Level::INFO
};
let subscriber = FmtSubscriber::builder().with_max_level(level).finish();
tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed");
let access_token = args.access_token.as_deref();
if let Some(file) = args.file_to_pull {
info!("Single file mode: {}", file.to_string_lossy());
let result = lfspull::pull_file(
file,
access_token,
args.max_retry,
args.random_bytes,
args.timeout,
)
.await?;
info!("Result: {}", result);
}
if let Some(recurse_pattern) = args.recurse_pattern {
info!("Glob-recurse mode: {}", &recurse_pattern);
let results = lfspull::glob_recurse_pull_directory(
&recurse_pattern,
access_token,
args.max_retry,
args.random_bytes,
args.timeout,
)
.await?;
info!("Pulling finished! Listing files and sources: ");
results.into_iter().enumerate().for_each(|(id, (n, r))| {
info!("{id} - '{n}': {r}");
});
}
Ok(())
}