Skip to content

Commit

Permalink
Merge pull request #141 from RobWalt/feat/improve-init
Browse files Browse the repository at this point in the history
Feat/improve init
  • Loading branch information
pksunkara committed Dec 25, 2023
2 parents c52c26d + 7b6774e commit 3d925ea
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 38 deletions.
8 changes: 4 additions & 4 deletions cargo-workspaces/Cargo.lock

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

24 changes: 8 additions & 16 deletions cargo-workspaces/src/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use dunce::canonicalize;
use glob::Pattern;
use oclif::term::TERM_ERR;
use semver::Version;
use toml_edit::{Array, Decor, Document, Formatted, Item, Table, Value};
use toml_edit::{Array, Document, Formatted, Item, Table, Value};

use std::{
collections::BTreeMap as Map,
Expand Down Expand Up @@ -243,23 +243,15 @@ fn add_workspace_member(

let members_array = members_item.as_array_mut().expect(INTERNAL_ERR);

let existing_prefix = members_array
let (prefix, suffix) = members_array
.iter()
.next()
.and_then(|item| item.decor().prefix().cloned());
.last()
.map(|item| item.decor())
.and_then(|decor| Some((decor.prefix()?.as_str()?, decor.suffix()?.as_str()?)))
.unwrap_or(("\n ", ",\n"));

let existing_suffix = members_array
.iter()
.next()
.and_then(|item| item.decor().suffix().cloned());

let decor = Decor::new(
existing_prefix.unwrap_or_else(|| "\n ".into()),
existing_suffix.unwrap_or_else(|| ",\n".into()),
);

let mut new_elem = Value::String(Formatted::new(new_member_path.to_owned()));
*new_elem.decor_mut() = decor;
let new_elem =
Value::String(Formatted::new(new_member_path.to_owned())).decorated(prefix, suffix);

members_array.push_formatted(new_elem);

Expand Down
89 changes: 71 additions & 18 deletions cargo-workspaces/src/init.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,40 @@
use crate::utils::{info, Error, Result};

use cargo_metadata::MetadataCommand;
use clap::Parser;
use clap::{ArgEnum, Parser};
use dunce::canonicalize;
use glob::glob;
use toml_edit::{Array, Document, Formatted, Item, Table, Value};

use std::{collections::HashSet, fs::write, path::PathBuf};

#[derive(Debug, Clone, Copy, ArgEnum)]
enum Resolver {
#[clap(name = "1")]
V1,
#[clap(name = "2")]
V2,
}

impl Resolver {
fn name(&self) -> &str {
match self {
Resolver::V1 => "1",
Resolver::V2 => "2",
}
}
}

/// Initializes a new cargo workspace
#[derive(Debug, Parser)]
pub struct Init {
/// Path to the workspace root
#[clap(parse(from_os_str), default_value = ".")]
path: PathBuf,

/// Workspace feature resolver version
#[clap(long, arg_enum)]
resolver: Option<Resolver>,
}

impl Init {
Expand Down Expand Up @@ -46,26 +68,57 @@ impl Init {

let ws = canonicalize(&self.path)?;

let mut content = "[workspace]\nmembers = [".to_string();

let mut members: Vec<_> = workspace_roots
.iter()
.filter_map(|m| m.strip_prefix(&ws).ok())
.collect();

members.sort();

if !members.is_empty() {
content.push('\n');
let mut document = Document::default();

let workspace = document
.entry("workspace")
.or_insert_with(|| Item::Table(Table::default()))
.as_table_mut()
.ok_or_else(|| {
Error::WorkspaceBadFormat(
"no workspace table found in workspace Cargo.toml".to_string(),
)
})?;

// workspace members
{
let workspace_members = workspace
.entry("members")
.or_insert_with(|| Item::Value(Value::Array(Array::new())))
.as_array_mut()
.ok_or_else(|| {
Error::WorkspaceBadFormat(
"members was not an array in workspace Cargo.toml".to_string(),
)
})?;

let mut members: Vec<_> = workspace_roots
.iter()
.filter_map(|m| m.strip_prefix(&ws).ok())
.map(|path| path.to_string())
.collect();

members.sort();

info!("crates", members.join(", "));

let max_member = members.len().saturating_sub(1);

workspace_members.extend(members.into_iter().enumerate().map(|(i, val)| {
let prefix = "\n ";
let suffix = if i == max_member { ",\n" } else { "" };
Value::String(Formatted::new(val)).decorated(prefix, suffix)
}));
}

members
.into_iter()
.for_each(|m| content.push_str(&format!(" \"{m}\",\n")));

content.push_str("]\n");
// workspace resolver
if let Some(resolver) = self.resolver {
workspace.entry("resolver").or_insert_with(|| {
Item::Value(Value::String(Formatted::new(resolver.name().to_owned())))
});
}

write(cargo_toml, content)?;
write(cargo_toml, document.to_string())?;

info!("initialized", self.path.display());
Ok(())
Expand Down
2 changes: 2 additions & 0 deletions cargo-workspaces/tests/snapshots/init__normal.snap
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
---
source: tests/init.rs
assertion_line: 26
expression: err
---
info crates dep1, dep2, top
info initialized .

0 comments on commit 3d925ea

Please sign in to comment.