Skip to content

Commit

Permalink
refactor(create-farm): rewrite create-farm with clap (#1493)
Browse files Browse the repository at this point in the history
* refactor(create-farm): rewrite create-farm cli

- Use `clap` instead of `pico-args` to parse args
- Use `clap` to implement cli helper
- Fix all warnings of dead codes
- Fix `--manager` takes no effect
- Update dependencies and remove `pico-args`

Related Issue: #1277

* chore(changeset): add changeset
  • Loading branch information
fu050409 committed Jul 2, 2024
1 parent 0184c28 commit 8106989
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 57 deletions.
5 changes: 5 additions & 0 deletions .changeset/serious-bears-grin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"create-farm": patch
---

Refactor create-farm with clap
132 changes: 123 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions crates/create-farm-rs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ path = "src/main.rs"

[dependencies]
anyhow = "1"
pico-args = "0.5"
dialoguer = "0.10"
dialoguer = "0.11"
# Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix
napi = { version = "2.15.2", default-features = false, features = [
"napi4",
"serde-json",
] }
napi-derive = "2.15.2"
rust-embed = { version = "8.3", features = [ "compression", "interpolate-folder-path" ] }
clap = { version = "4.5.8", features = ["derive"] }

[build-dependencies]
napi-build = "2.0.1"
46 changes: 13 additions & 33 deletions crates/create-farm-rs/src/args.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
use crate::{package_manager::PackageManager, template::Template, utils::colors::*};
use std::ffi::OsString;
use pico_args::Arguments;

#[derive(Debug)]
use crate::{package_manager::PackageManager, template::Template};
use clap::Parser;

#[derive(Parser, Debug)]
#[command(
name = "create-farm",
about,
long_about = None,
version,
)]
pub struct Args {
#[arg(help = "Project name")]
pub project_name: Option<String>,
#[arg(short, long, help = "Package manager to use")]
pub manager: Option<PackageManager>,
#[arg(short, long, help = "Project template to use")]
pub template: Option<Template>,
}


impl Default for Args {
fn default() -> Self {
Self {
Expand All @@ -19,30 +26,3 @@ impl Default for Args {
}
}
}


pub fn parse(argv: Vec<OsString>, bin_name: Option<String>) -> anyhow::Result<Args> {
let mut pargs = Arguments::from_vec(argv);

if pargs.contains(["-h", "--help"]) {
let help = format!(
r#""#
);

println!("{help}");
std::process::exit(0);
}
if pargs.contains(["-v", "--version"]) {
println!("{}", env!("CARGO_PKG_VERSION"));
std::process::exit(0);
}


let args = Args {
manager: pargs.opt_value_from_str(["-m", "--manager"])?,
template: pargs.opt_value_from_str(["-t", "--template"])?,
project_name: pargs.opt_free_from_str()?,
};

Ok(args)
}
17 changes: 13 additions & 4 deletions crates/create-farm-rs/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use anyhow::Context;
use clap::Parser;
use dialoguer::{Confirm, Input, Select};
use std::{ffi::OsString, fs, process::exit};

Expand Down Expand Up @@ -37,7 +38,11 @@ where
handle_brand_text("\n ⚡ Welcome To Farm ! \n");

let detected_manager = detected_manager.and_then(|p| p.parse::<PackageManager>().ok());
let args = args::parse(args.into_iter().map(Into::into).collect(), bin_name)?;
// Clap will auto parse the `bin_name` as the first argument, so we need to add it to the args
let args = args::Args::parse_from(
std::iter::once(OsString::from(bin_name.unwrap_or_default()))
.chain(args.into_iter().map(Into::into)),
);
let defaults = args::Args::default();
let args::Args {
manager,
Expand All @@ -46,14 +51,18 @@ where
} = args;
let cwd = std::env::current_dir()?;
let project_name = match project_name {
Some(name) => name,
Some(name) => to_valid_pkg_name(&name),
None => Input::<String>::with_theme(&ColorfulTheme::default())
.with_prompt("Project name")
.default("farm-project".into())
.interact_text()?
.trim()
.into(),
};
if !is_valid_pkg_name(&project_name) {
eprintln!("{BOLD}{RED}✘{RESET} Invalid project name: {BOLD}{YELLOW}{project_name}{RESET}");
exit(1);
}
let target_dir = cwd.join(&project_name);

if target_dir.exists() && target_dir.read_dir()?.next().is_some() {
Expand All @@ -78,10 +87,10 @@ where
}
};

let pkg_manager = match detected_manager {
let pkg_manager = manager.unwrap_or(match detected_manager {
Some(manager) => manager,
None => defaults.manager.context("default manager not set")?,
};
});

let templates_no_flavors = pkg_manager.templates_no_flavors();

Expand Down
7 changes: 3 additions & 4 deletions crates/create-farm-rs/src/package_manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ impl<'a> PackageManager {
];

/// Node.js managers
pub const NODE: &'a [PackageManager] = &[
pub const _NODE: &'a [PackageManager] = &[
PackageManager::Pnpm,
PackageManager::Yarn,
PackageManager::Npm,
Expand Down Expand Up @@ -85,7 +85,7 @@ impl PackageManager {
}
}

pub const fn templates(&self) -> &[Template] {
pub const fn _templates(&self) -> &[Template] {
match self {
PackageManager::Pnpm | PackageManager::Yarn | PackageManager::Npm | PackageManager::Bun => &[
Template::Vanilla,
Expand All @@ -108,7 +108,6 @@ impl PackageManager {
PackageManager::Yarn => Some("yarn"),
PackageManager::Npm => Some("npm install"),
PackageManager::Bun => Some("bun install"),
_ => None,
}
}

Expand All @@ -121,7 +120,7 @@ impl PackageManager {
}
}

pub const fn is_node(&self) -> bool {
pub const fn _is_node(&self) -> bool {
matches!(
self,
PackageManager::Pnpm | PackageManager::Yarn | PackageManager::Npm | PackageManager::Bun,
Expand Down
Loading

0 comments on commit 8106989

Please sign in to comment.