use super::aapt2_tool;
use crate::error::*;
use std::path::{Path, PathBuf};
#[derive(Default)]
pub struct Aapt2Dump {
subcommand: SubCommand,
filename_apk: PathBuf,
no_values: bool,
dumped_file: Option<PathBuf>,
verbose: bool,
help: bool,
}
impl Aapt2Dump {
pub fn new(subcommand: SubCommand, filename_apk: &Path) -> Self {
Self {
subcommand,
filename_apk: filename_apk.to_owned(),
..Default::default()
}
}
pub fn no_values(&mut self, no_values: bool) -> &mut Self {
self.no_values = no_values;
self
}
pub fn dumped_file(&mut self, dumped_file: &Path) -> &mut Self {
self.dumped_file = Some(dumped_file.to_owned());
self
}
pub fn verbose(&mut self, verbose: bool) -> &mut Self {
self.verbose = verbose;
self
}
pub fn help(&mut self, help: bool) -> &mut Self {
self.help = help;
self
}
pub fn run(&self) -> Result<()> {
let mut aapt2 = aapt2_tool()?;
aapt2.arg("dump");
aapt2.arg(self.subcommand.to_string());
aapt2.arg(&self.filename_apk);
if self.no_values {
aapt2.arg("--no-values");
}
if let Some(dumped_file) = &self.dumped_file {
aapt2.arg("--file").arg(dumped_file);
}
if self.verbose {
aapt2.arg("-v");
}
if self.help {
aapt2.arg("-h");
}
aapt2.output_err(true)?;
Ok(())
}
}
pub enum SubCommand {
Apc,
Badging,
Configurations,
Packagename,
Permissions,
Strings,
Styleparents,
Resources,
Xmlstrings,
Xmltree,
}
impl std::fmt::Display for SubCommand {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match *self {
Self::Apc => write!(f, "apc"),
Self::Badging => write!(f, "badging"),
Self::Configurations => write!(f, "configurations"),
Self::Packagename => write!(f, "packagename"),
Self::Permissions => write!(f, "permissions"),
Self::Strings => write!(f, "strings"),
Self::Styleparents => write!(f, "styleparents"),
Self::Resources => write!(f, "resources"),
Self::Xmlstrings => write!(f, "xmlstrings"),
Self::Xmltree => write!(f, "xmltree"),
}
}
}
impl Default for SubCommand {
fn default() -> Self {
Self::Apc
}
}