use crate::{
constants::*,
models::{Grid, MetadataPosition, TimestampPosition},
};
use clap::AppSettings;
use humantime::DurationError;
use std::time::Duration;
use structopt::StructOpt;
pub fn application_args() -> Args {
Args::from_args()
}
#[derive(Clone, Debug, StructOpt)]
#[structopt(global_settings(&[AppSettings::ColoredHelp]))]
pub struct Args {
#[structopt(skip)]
pub num_groups: Option<u32>,
#[structopt(skip)]
pub num_selected: Option<u32>,
#[structopt(long, short)]
pub accurate: bool,
#[structopt(long, short = "A", required = false, default_value = "1.0")]
pub accurate_delay_seconds: f32,
#[structopt(long, short = "S")]
pub actual_size: bool,
#[structopt(long, default_value = "39897eff", required = false)]
pub background_colour: String,
#[structopt(long, default_value = "255", required = false)]
pub capture_alpha: u8,
#[structopt(long)]
pub delay_percent: Option<f32>,
#[structopt(long, default_value = "7", required = false)]
pub end_delay_percent: f32,
#[structopt(long)]
pub exclude_extensions: Vec<String>,
#[structopt(long)]
pub fast: bool,
#[structopt(long)]
pub frame_type: Option<String>,
#[structopt(multiple = true, required = true)]
pub filenames: Vec<String>,
#[structopt(long, short = "g", default_value = "4x4", required = false)]
pub grid: Grid,
#[structopt(long)]
pub grid_spacing: Option<u32>,
#[structopt(long, default_value = "15", required = false)]
pub grid_horizontal_spacing: u32,
#[structopt(long, default_value = "15", required = false)]
pub grid_vertical_spacing: u32,
#[structopt(long = "format", short = "f", default_value = "jpg", required = false)]
pub image_format: String,
#[structopt(long)]
pub ignore_errors: bool,
#[structopt(long, parse(try_from_str = parse_humantime_duration))]
pub interval: Option<Duration>,
#[structopt(long = "manual", short = "m", required = false)]
pub manual_timestamps: Vec<String>,
#[structopt(long, default_value = "39897eff", required = false)]
pub metadata_background_colour: String,
#[structopt(long)]
pub metadata_font: Option<String>,
#[structopt(long, default_value = "ffffff00", required = false)]
pub metadata_font_colour: String,
#[structopt(long, default_value = "32", required = false)]
pub metadata_font_size: f32,
#[structopt(long, default_value = "15", required = false)]
pub metadata_horizontal_margin: u32,
#[structopt(long, default_value = "15", required = false)]
pub metadata_margin: u32,
#[structopt(
long,
possible_values = &MetadataPosition::variants(),
case_insensitive = true,
required = false,
default_value = "top"
)]
pub metadata_position: MetadataPosition,
#[structopt(long, default_value = "15", required = false)]
pub metadata_vertical_margin: u32,
#[structopt(long)]
pub no_overwrite: bool,
#[structopt(long = "output", short = "o")]
pub output_path: Option<String>,
#[structopt(long, short)]
pub recursive: bool,
#[structopt(long, short = "s")]
pub num_samples: Option<u32>,
#[structopt(long)]
pub no_shadow: bool,
#[structopt(long, default_value = "7", required = false)]
pub start_delay_percent: f32,
#[structopt(long, short = "t")]
pub show_timestamp: bool,
#[structopt(long, short = "O")]
pub thumbnail_output_path: Option<String>,
#[structopt(long, default_value = "000000aa", required = false)]
pub timestamp_background_colour: String,
#[structopt(long, default_value = "000000", required = false)]
pub timestamp_border_colour: String,
#[structopt(long)]
pub timestamp_border_mode: bool,
#[structopt(long, default_value = "1.0")]
pub timestamp_border_radius: f32,
#[structopt(long, default_value = "1", required = false)]
pub timestamp_border_size: u32,
#[structopt(long)]
pub timestamp_font: Option<String>,
#[structopt(long, default_value = "ffffff", required = false)]
pub timestamp_font_colour: String,
#[structopt(long, default_value = "12", required = false)]
pub timestamp_font_size: f32,
#[structopt(
long,
short = "T",
possible_values = &TimestampPosition::variants(),
case_insensitive = true,
default_value = "se",
required = false
)]
pub timestamp_position: TimestampPosition,
#[structopt(long, default_value = "5", required = false)]
pub timestamp_horizontal_margin: u32,
#[structopt(long, default_value = "3", required = false)]
pub timestamp_horizontal_padding: u32,
#[structopt(long, default_value = "5", required = false)]
pub timestamp_vertical_margin: u32,
#[structopt(long, default_value = "1", required = false)]
pub timestamp_vertical_padding: u32,
#[structopt(long = "width", short = "w", default_value = "1500", required = false)]
pub vcs_width: u32,
#[structopt(long, short)]
pub verbose: bool,
}
impl Args {
fn num_samples(grid: Grid) -> Option<u32> {
Some(grid.x * grid.y)
}
}
impl Default for Args {
fn default() -> Self {
Self {
num_groups: None,
num_selected: None,
accurate: false,
accurate_delay_seconds: DEFAULT_ACCURATE_DELAY_SECONDS,
background_colour: String::from(DEFAULT_BACKGROUND_COLOUR),
actual_size: false,
capture_alpha: DEFAULT_CAPTURE_ALPHA,
delay_percent: DEFAULT_DELAY_PERCENT,
end_delay_percent: DEFAULT_END_DELAY_PERCENT,
exclude_extensions: vec![
String::from("jpg"),
String::from("txt"),
String::from("srt"),
String::from("png"),
],
fast: false,
frame_type: DEFAULT_FRAME_TYPE,
filenames: vec![],
grid: DEFAULT_GRID_SIZE,
grid_spacing: DEFAULT_GRID_SPACING,
grid_horizontal_spacing: DEFAULT_GRID_HORIZONTAL_SPACING,
grid_vertical_spacing: DEFAULT_GRID_VERTICAL_SPACING,
image_format: String::from(DEFAULT_IMAGE_FORMAT),
ignore_errors: false,
interval: DEFAULT_INTERVAL,
manual_timestamps: vec![],
metadata_background_colour: String::from(DEFAULT_BACKGROUND_COLOUR),
metadata_font: DEFAULT_METADATA_FONT,
metadata_font_colour: String::from(DEFAULT_METADATA_FONT_COLOUR),
metadata_font_size: DEFAULT_METADATA_FONT_SIZE,
metadata_horizontal_margin: DEFAULT_METADATA_HORIZONTAL_MARGIN,
metadata_margin: DEFAULT_METADATA_MARGIN,
metadata_position: DEFAULT_METADATA_POSITION,
metadata_vertical_margin: DEFAULT_METADATA_VERTICAL_MARGIN,
no_overwrite: false,
output_path: None,
recursive: false,
num_samples: None,
no_shadow: false,
start_delay_percent: DEFAULT_START_DELAY_PERCENT,
show_timestamp: true,
thumbnail_output_path: None,
timestamp_background_colour: String::from(DEFAULT_TIMESTAMP_BACKGROUND_COLOUR),
timestamp_border_colour: String::from(DEFAULT_TIMESTAMP_BORDER_COLOUR),
timestamp_border_mode: false,
timestamp_border_radius: 1.0,
timestamp_border_size: 1,
timestamp_font: None,
timestamp_font_colour: String::from(DEFAULT_TIMESTAMP_FONT_COLOUR),
timestamp_font_size: DEFAULT_TIMESTAMP_FONT_SIZE,
timestamp_position: DEFAULT_TIMESTAMP_POSITION,
timestamp_horizontal_margin: DEFAULT_TIMESTAMP_HORIZONTAL_MARGIN,
timestamp_horizontal_padding: DEFAULT_TIMESTAMP_HORIZONTAL_PADDING,
timestamp_vertical_margin: DEFAULT_TIMESTAMP_VERTICAL_MARGIN,
timestamp_vertical_padding: DEFAULT_TIMESTAMP_VERTICAL_PADDING,
vcs_width: DEFAULT_CONTACT_SHEET_WIDTH,
verbose: false,
}
}
}
fn parse_humantime_duration(src: &str) -> Result<Duration, DurationError> {
Ok(src.parse::<humantime::Duration>()?.into())
}