feat: allow multiple customisable scripts packages in init

This commit is contained in:
daimond113 2024-12-09 11:35:02 +01:00
parent 6d8731f1e5
commit e51bc9f9bb
No known key found for this signature in database
GPG key ID: 3A8ECE51328B513C
3 changed files with 61 additions and 5 deletions

View file

@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
### Added
- Allow multiple, user selectable scripts packages to be selected (& custom packages inputted) in `init` command by @daimond113
### Performance ### Performance
- Use `exec` in Unix bin linking to reduce the number of processes by @daimond113 - Use `exec` in Unix bin linking to reduce the number of processes by @daimond113

View file

@ -16,11 +16,26 @@ use pesde::{
Project, DEFAULT_INDEX_NAME, SCRIPTS_LINK_FOLDER, Project, DEFAULT_INDEX_NAME, SCRIPTS_LINK_FOLDER,
}; };
use semver::VersionReq; use semver::VersionReq;
use std::{collections::HashSet, str::FromStr}; use std::{collections::HashSet, fmt::Display, str::FromStr};
#[derive(Debug, Args)] #[derive(Debug, Args)]
pub struct InitCommand {} pub struct InitCommand {}
#[derive(Debug)]
enum PackageNameOrCustom {
PackageName(PackageName),
Custom,
}
impl Display for PackageNameOrCustom {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PackageNameOrCustom::PackageName(n) => write!(f, "{n}"),
PackageNameOrCustom::Custom => write!(f, "custom"),
}
}
}
impl InitCommand { impl InitCommand {
pub async fn run(self, project: Project) -> anyhow::Result<()> { pub async fn run(self, project: Project) -> anyhow::Result<()> {
match project.read_manifest().await { match project.read_manifest().await {
@ -127,7 +142,45 @@ impl InitCommand {
.await .await
.context("failed to get source config")?; .context("failed to get source config")?;
if let Some(scripts_pkg_name) = config.scripts_package { let scripts_package = inquire::Select::new(
"which scripts package do you want to use?",
config
.scripts_packages
.into_iter()
.map(PackageNameOrCustom::PackageName)
.chain(std::iter::once(PackageNameOrCustom::Custom))
.collect(),
)
.prompt()
.unwrap();
let scripts_package = match scripts_package {
PackageNameOrCustom::PackageName(p) => Some(p),
PackageNameOrCustom::Custom => {
let name = inquire::Text::new("which package to use?")
.with_validator(|name: &str| {
if name.is_empty() {
return Ok(Validation::Valid);
}
Ok(match PackageName::from_str(name) {
Ok(_) => Validation::Valid,
Err(e) => Validation::Invalid(e.to_string().into()),
})
})
.with_help_message("leave empty for none")
.prompt()
.unwrap();
if name.is_empty() {
None
} else {
Some(PackageName::from_str(&name).unwrap())
}
}
};
if let Some(scripts_pkg_name) = scripts_package {
let (v_id, pkg_ref) = source let (v_id, pkg_ref) = source
.resolve( .resolve(
&PesdeDependencySpecifier { &PesdeDependencySpecifier {
@ -185,7 +238,7 @@ impl InitCommand {
} else { } else {
println!( println!(
"{}", "{}",
"configured index hasn't a configured scripts package".red() "no scripts package configured, this can cause issues with Roblox compatibility".red()
); );
if !inquire::prompt_confirmation("initialize regardless?").unwrap() { if !inquire::prompt_confirmation("initialize regardless?").unwrap() {
return Ok(()); return Ok(());

View file

@ -316,9 +316,9 @@ pub struct IndexConfig {
/// The maximum size of an archive in bytes /// The maximum size of an archive in bytes
#[serde(default = "default_archive_size")] #[serde(default = "default_archive_size")]
pub max_archive_size: usize, pub max_archive_size: usize,
/// The package to use for default script implementations /// The packages to display in the CLI for default script implementations
#[serde(default)] #[serde(default)]
pub scripts_package: Option<PackageName>, pub scripts_packages: Vec<PackageName>,
} }
impl IndexConfig { impl IndexConfig {