use std::path::PathBuf;
use anyhow::Result;
use crate::entry::SortOrder;
use crate::filter::{Filter, FilterInputs};
use crate::render::{LargestFormat, RenderMode};
use crate::scan::HardlinkPolicy;
use super::args::Cli;
pub(super) enum RunPlan {
ExplainCategory { name: String, json: bool },
#[cfg(feature = "ui")]
Ui {
path: PathBuf,
port: u16,
sort: SortOrder,
reverse: bool,
hardlinks: HardlinkPolicy,
},
Scan(ScanPlan),
}
pub(super) struct ScanPlan {
pub path: PathBuf,
pub sort: SortOrder,
pub reverse: bool,
pub hardlinks: HardlinkPolicy,
pub max_depth: Option<usize>,
pub top: Option<usize>,
pub mode: RenderMode,
pub filter: Filter,
}
pub(super) fn from_cli(cli: Cli) -> Result<RunPlan> {
if let Some(name) = cli.explain_category {
return Ok(RunPlan::ExplainCategory {
name,
json: cli.json,
});
}
let path = cli.path.canonicalize().unwrap_or(cli.path.clone());
#[cfg(feature = "ui")]
if cli.ui {
return Ok(RunPlan::Ui {
path,
port: cli.port,
sort: cli.sort,
reverse: cli.reverse,
hardlinks: cli.hardlinks,
});
}
let filter = Filter::from_inputs(FilterInputs {
categories: cli.category,
type_: cli.r#type,
min_size: cli.min_size,
names: cli.name,
changed_within: cli.changed_within,
changed_before: cli.changed_before,
})?;
let mode = if let Some(n) = cli.largest {
let format = if cli.json {
LargestFormat::Json
} else if cli.ndjson {
LargestFormat::Ndjson
} else {
LargestFormat::Text
};
RenderMode::Largest { n, format }
} else if cli.json {
RenderMode::Json
} else if cli.ndjson {
RenderMode::Ndjson
} else if cli.summary {
RenderMode::Summary
} else {
RenderMode::Tree
};
Ok(RunPlan::Scan(ScanPlan {
path,
sort: cli.sort,
reverse: cli.reverse,
hardlinks: cli.hardlinks,
max_depth: cli.max_depth,
top: cli.top,
mode,
filter,
}))
}