use anyhow::Result;
use clap::{Parser, Subcommand};
use electron_tasje::app::App;
use electron_tasje::config::CopyDef;
use electron_tasje::desktop::DesktopGenerator;
use electron_tasje::environment::{
Architecture, Environment, Platform, HOST_ARCHITECTURE, HOST_PLATFORM,
};
use electron_tasje::pack::PackingProcessBuilder;
use std::env::current_dir;
#[derive(Subcommand, Debug)]
#[clap(author, version, about, long_about = None)]
enum Command {
Pack {
#[clap(short, long, value_parser)]
output: Option<String>,
#[clap(long, value_parser)]
additional_files: Vec<String>,
#[clap(long, value_parser)]
additional_asar_unpack: Vec<String>,
#[clap(long, value_parser)]
additional_extra_resources: Vec<String>,
},
GenerateDesktop {
#[clap(short, long, value_parser)]
output: Option<String>,
},
}
use Command::*;
#[derive(Parser, Debug)]
struct Args {
#[command(subcommand)]
command: Command,
#[clap(short, long, value_parser)]
config: Option<String>,
#[clap(long, value_parser)]
target_architecture: Option<String>,
#[clap(long, value_parser)]
target_platform: Option<String>,
}
fn main() -> Result<()> {
let args = Args::parse();
let Args { config, .. } = args;
let target_architecture = if let Some(arch) = args.target_architecture {
Architecture::from_tasje_name(&arch)?
} else {
HOST_ARCHITECTURE
};
let target_platform = if let Some(platform) = args.target_platform {
Platform::from_tasje_name(&platform)?
} else {
HOST_PLATFORM
};
let target_environment = Environment {
architecture: target_architecture,
platform: target_platform,
};
let root = current_dir()?;
let package_path = root.join("package.json");
let app = if let Some(config_path) = &config {
App::new_from_files(&package_path, root.join(config_path))?
} else {
App::new_from_package_file(&package_path)?
};
match args.command {
Pack {
output,
additional_files,
additional_asar_unpack,
additional_extra_resources,
} => {
let mut builder =
PackingProcessBuilder::new(app).target_environment(target_environment);
if let Some(out) = output {
builder = builder.base_output_dir(out);
}
builder
.additional_files(
additional_files
.into_iter()
.map(CopyDef::Simple)
.collect(),
)
.additional_asar_unpack(additional_asar_unpack)
.additional_extra_resources(
additional_extra_resources
.into_iter()
.map(CopyDef::Simple)
.collect(),
)
.build()
.proceed()?;
}
GenerateDesktop { output } => {
DesktopGenerator::new().write_to_output_dir(&app, target_platform, output)?;
}
}
Ok(())
}