style: apply cargo fmt workspace-wide
Pure formatting pass from `cargo fmt --all`. No logic changes. Separating this out so the 1.9 release feature commits that follow show only their intentional edits.
This commit is contained in:
@@ -229,7 +229,10 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn subcommand_args_nextest_has_run() {
|
||||
assert_eq!(CargoCommand::Nextest.subcommand_args(), vec!["nextest", "run"]);
|
||||
assert_eq!(
|
||||
CargoCommand::Nextest.subcommand_args(),
|
||||
vec!["nextest", "run"]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -241,8 +244,14 @@ mod tests {
|
||||
fn install_package_external_tools() {
|
||||
assert_eq!(CargoCommand::Audit.install_package(), Some("cargo-audit"));
|
||||
assert_eq!(CargoCommand::Deny.install_package(), Some("cargo-deny"));
|
||||
assert_eq!(CargoCommand::Nextest.install_package(), Some("cargo-nextest"));
|
||||
assert_eq!(CargoCommand::LlvmCov.install_package(), Some("cargo-llvm-cov"));
|
||||
assert_eq!(
|
||||
CargoCommand::Nextest.install_package(),
|
||||
Some("cargo-nextest")
|
||||
);
|
||||
assert_eq!(
|
||||
CargoCommand::LlvmCov.install_package(),
|
||||
Some("cargo-llvm-cov")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use async_trait::async_trait;
|
||||
use wfe_core::WfeError;
|
||||
use wfe_core::models::ExecutionResult;
|
||||
use wfe_core::traits::step::{StepBody, StepExecutionContext};
|
||||
use wfe_core::WfeError;
|
||||
|
||||
use crate::cargo::config::{CargoCommand, CargoConfig};
|
||||
|
||||
@@ -88,7 +88,10 @@ impl CargoStep {
|
||||
/// Ensures an external cargo tool is installed before running it.
|
||||
/// For built-in cargo subcommands, this is a no-op.
|
||||
async fn ensure_tool_available(&self) -> Result<(), WfeError> {
|
||||
let (binary, package) = match (self.config.command.binary_name(), self.config.command.install_package()) {
|
||||
let (binary, package) = match (
|
||||
self.config.command.binary_name(),
|
||||
self.config.command.install_package(),
|
||||
) {
|
||||
(Some(b), Some(p)) => (b, p),
|
||||
_ => return Ok(()),
|
||||
};
|
||||
@@ -117,9 +120,11 @@ impl CargoStep {
|
||||
.stderr(std::process::Stdio::piped())
|
||||
.output()
|
||||
.await
|
||||
.map_err(|e| WfeError::StepExecution(format!(
|
||||
"Failed to add llvm-tools-preview component: {e}"
|
||||
)))?;
|
||||
.map_err(|e| {
|
||||
WfeError::StepExecution(format!(
|
||||
"Failed to add llvm-tools-preview component: {e}"
|
||||
))
|
||||
})?;
|
||||
|
||||
if !component.status.success() {
|
||||
let stderr = String::from_utf8_lossy(&component.stderr);
|
||||
@@ -135,9 +140,7 @@ impl CargoStep {
|
||||
.stderr(std::process::Stdio::piped())
|
||||
.output()
|
||||
.await
|
||||
.map_err(|e| WfeError::StepExecution(format!(
|
||||
"Failed to install {package}: {e}"
|
||||
)))?;
|
||||
.map_err(|e| WfeError::StepExecution(format!("Failed to install {package}: {e}")))?;
|
||||
|
||||
if !install.status.success() {
|
||||
let stderr = String::from_utf8_lossy(&install.stderr);
|
||||
@@ -162,17 +165,16 @@ impl CargoStep {
|
||||
let doc_dir = std::path::Path::new(working_dir).join("target/doc");
|
||||
|
||||
let json_path = std::fs::read_dir(&doc_dir)
|
||||
.map_err(|e| WfeError::StepExecution(format!(
|
||||
"failed to read target/doc: {e}"
|
||||
)))?
|
||||
.map_err(|e| WfeError::StepExecution(format!("failed to read target/doc: {e}")))?
|
||||
.filter_map(|entry| entry.ok())
|
||||
.find(|entry| {
|
||||
entry.path().extension().is_some_and(|ext| ext == "json")
|
||||
})
|
||||
.find(|entry| entry.path().extension().is_some_and(|ext| ext == "json"))
|
||||
.map(|entry| entry.path())
|
||||
.ok_or_else(|| WfeError::StepExecution(
|
||||
"no JSON file found in target/doc/ — did rustdoc --output-format json succeed?".to_string()
|
||||
))?;
|
||||
.ok_or_else(|| {
|
||||
WfeError::StepExecution(
|
||||
"no JSON file found in target/doc/ — did rustdoc --output-format json succeed?"
|
||||
.to_string(),
|
||||
)
|
||||
})?;
|
||||
|
||||
tracing::info!(path = %json_path.display(), "reading rustdoc JSON");
|
||||
|
||||
@@ -180,20 +182,20 @@ impl CargoStep {
|
||||
WfeError::StepExecution(format!("failed to read {}: {e}", json_path.display()))
|
||||
})?;
|
||||
|
||||
let krate: rustdoc_types::Crate = serde_json::from_str(&json_content).map_err(|e| {
|
||||
WfeError::StepExecution(format!("failed to parse rustdoc JSON: {e}"))
|
||||
})?;
|
||||
let krate: rustdoc_types::Crate = serde_json::from_str(&json_content)
|
||||
.map_err(|e| WfeError::StepExecution(format!("failed to parse rustdoc JSON: {e}")))?;
|
||||
|
||||
let mdx_files = transform_to_mdx(&krate);
|
||||
|
||||
let output_dir = self.config.output_dir
|
||||
let output_dir = self
|
||||
.config
|
||||
.output_dir
|
||||
.as_deref()
|
||||
.unwrap_or("target/doc/mdx");
|
||||
let output_path = std::path::Path::new(working_dir).join(output_dir);
|
||||
|
||||
write_mdx_files(&mdx_files, &output_path).map_err(|e| {
|
||||
WfeError::StepExecution(format!("failed to write MDX files: {e}"))
|
||||
})?;
|
||||
write_mdx_files(&mdx_files, &output_path)
|
||||
.map_err(|e| WfeError::StepExecution(format!("failed to write MDX files: {e}")))?;
|
||||
|
||||
let file_count = mdx_files.len();
|
||||
tracing::info!(
|
||||
@@ -214,7 +216,10 @@ impl CargoStep {
|
||||
outputs.insert(
|
||||
"mdx.files".to_string(),
|
||||
serde_json::Value::Array(
|
||||
file_paths.into_iter().map(serde_json::Value::String).collect(),
|
||||
file_paths
|
||||
.into_iter()
|
||||
.map(serde_json::Value::String)
|
||||
.collect(),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -224,7 +229,10 @@ impl CargoStep {
|
||||
|
||||
#[async_trait]
|
||||
impl StepBody for CargoStep {
|
||||
async fn run(&mut self, context: &StepExecutionContext<'_>) -> wfe_core::Result<ExecutionResult> {
|
||||
async fn run(
|
||||
&mut self,
|
||||
context: &StepExecutionContext<'_>,
|
||||
) -> wfe_core::Result<ExecutionResult> {
|
||||
let step_name = context.step.name.as_deref().unwrap_or("unknown");
|
||||
let subcmd = self.config.command.as_str();
|
||||
|
||||
@@ -248,9 +256,9 @@ impl StepBody for CargoStep {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cmd.output()
|
||||
.await
|
||||
.map_err(|e| WfeError::StepExecution(format!("Failed to spawn cargo {subcmd}: {e}")))?
|
||||
cmd.output().await.map_err(|e| {
|
||||
WfeError::StepExecution(format!("Failed to spawn cargo {subcmd}: {e}"))
|
||||
})?
|
||||
};
|
||||
|
||||
let stdout = String::from_utf8_lossy(&output.stdout).to_string();
|
||||
@@ -317,7 +325,11 @@ mod tests {
|
||||
let cmd = step.build_command();
|
||||
let prog = cmd.as_std().get_program().to_str().unwrap();
|
||||
assert_eq!(prog, "cargo");
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["build"]);
|
||||
}
|
||||
|
||||
@@ -329,7 +341,11 @@ mod tests {
|
||||
let cmd = step.build_command();
|
||||
let prog = cmd.as_std().get_program().to_str().unwrap();
|
||||
assert_eq!(prog, "rustup");
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["run", "nightly", "cargo", "test"]);
|
||||
}
|
||||
|
||||
@@ -340,8 +356,15 @@ mod tests {
|
||||
config.features = vec!["feat1".to_string(), "feat2".to_string()];
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
assert_eq!(args, vec!["check", "-p", "my-crate", "--features", "feat1,feat2"]);
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec!["check", "-p", "my-crate", "--features", "feat1,feat2"]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -351,8 +374,20 @@ mod tests {
|
||||
config.target = Some("aarch64-unknown-linux-gnu".to_string());
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
assert_eq!(args, vec!["build", "--release", "--target", "aarch64-unknown-linux-gnu"]);
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
"build",
|
||||
"--release",
|
||||
"--target",
|
||||
"aarch64-unknown-linux-gnu"
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -364,10 +399,23 @@ mod tests {
|
||||
config.extra_args = vec!["--".to_string(), "-D".to_string(), "warnings".to_string()];
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec!["clippy", "--all-features", "--no-default-features", "--profile", "dev", "--", "-D", "warnings"]
|
||||
vec![
|
||||
"clippy",
|
||||
"--all-features",
|
||||
"--no-default-features",
|
||||
"--profile",
|
||||
"dev",
|
||||
"--",
|
||||
"-D",
|
||||
"warnings"
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
@@ -377,17 +425,29 @@ mod tests {
|
||||
config.extra_args = vec!["--check".to_string()];
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["fmt", "--check"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_command_publish_dry_run() {
|
||||
let mut config = minimal_config(CargoCommand::Publish);
|
||||
config.extra_args = vec!["--dry-run".to_string(), "--registry".to_string(), "my-reg".to_string()];
|
||||
config.extra_args = vec![
|
||||
"--dry-run".to_string(),
|
||||
"--registry".to_string(),
|
||||
"my-reg".to_string(),
|
||||
];
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["publish", "--dry-run", "--registry", "my-reg"]);
|
||||
}
|
||||
|
||||
@@ -398,18 +458,27 @@ mod tests {
|
||||
config.release = true;
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["doc", "--release", "--no-deps"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_command_env_vars() {
|
||||
let mut config = minimal_config(CargoCommand::Build);
|
||||
config.env.insert("RUSTFLAGS".to_string(), "-D warnings".to_string());
|
||||
config
|
||||
.env
|
||||
.insert("RUSTFLAGS".to_string(), "-D warnings".to_string());
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let envs: Vec<_> = cmd.as_std().get_envs().collect();
|
||||
assert!(envs.iter().any(|(k, v)| *k == "RUSTFLAGS" && v == &Some("-D warnings".as_ref())));
|
||||
assert!(
|
||||
envs.iter()
|
||||
.any(|(k, v)| *k == "RUSTFLAGS" && v == &Some("-D warnings".as_ref()))
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -418,14 +487,21 @@ mod tests {
|
||||
config.working_dir = Some("/my/project".to_string());
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
assert_eq!(cmd.as_std().get_current_dir(), Some(std::path::Path::new("/my/project")));
|
||||
assert_eq!(
|
||||
cmd.as_std().get_current_dir(),
|
||||
Some(std::path::Path::new("/my/project"))
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_command_audit() {
|
||||
let step = CargoStep::new(minimal_config(CargoCommand::Audit));
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["audit"]);
|
||||
}
|
||||
|
||||
@@ -435,7 +511,11 @@ mod tests {
|
||||
config.extra_args = vec!["check".to_string()];
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["deny", "check"]);
|
||||
}
|
||||
|
||||
@@ -443,7 +523,11 @@ mod tests {
|
||||
fn build_command_nextest() {
|
||||
let step = CargoStep::new(minimal_config(CargoCommand::Nextest));
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["nextest", "run"]);
|
||||
}
|
||||
|
||||
@@ -454,25 +538,44 @@ mod tests {
|
||||
config.extra_args = vec!["--no-fail-fast".to_string()];
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
assert_eq!(args, vec!["nextest", "run", "--features", "feat1", "--no-fail-fast"]);
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec!["nextest", "run", "--features", "feat1", "--no-fail-fast"]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_command_llvm_cov() {
|
||||
let step = CargoStep::new(minimal_config(CargoCommand::LlvmCov));
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["llvm-cov"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn build_command_llvm_cov_with_args() {
|
||||
let mut config = minimal_config(CargoCommand::LlvmCov);
|
||||
config.extra_args = vec!["--html".to_string(), "--output-dir".to_string(), "coverage".to_string()];
|
||||
config.extra_args = vec![
|
||||
"--html".to_string(),
|
||||
"--output-dir".to_string(),
|
||||
"coverage".to_string(),
|
||||
];
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["llvm-cov", "--html", "--output-dir", "coverage"]);
|
||||
}
|
||||
|
||||
@@ -482,10 +585,24 @@ mod tests {
|
||||
let cmd = step.build_command();
|
||||
let prog = cmd.as_std().get_program().to_str().unwrap();
|
||||
assert_eq!(prog, "rustup");
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec!["run", "nightly", "cargo", "rustdoc", "--", "-Z", "unstable-options", "--output-format", "json"]
|
||||
vec![
|
||||
"run",
|
||||
"nightly",
|
||||
"cargo",
|
||||
"rustdoc",
|
||||
"--",
|
||||
"-Z",
|
||||
"unstable-options",
|
||||
"--output-format",
|
||||
"json"
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
@@ -496,10 +613,27 @@ mod tests {
|
||||
config.extra_args = vec!["--no-deps".to_string()];
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec!["run", "nightly", "cargo", "rustdoc", "-p", "my-crate", "--no-deps", "--", "-Z", "unstable-options", "--output-format", "json"]
|
||||
vec![
|
||||
"run",
|
||||
"nightly",
|
||||
"cargo",
|
||||
"rustdoc",
|
||||
"-p",
|
||||
"my-crate",
|
||||
"--no-deps",
|
||||
"--",
|
||||
"-Z",
|
||||
"unstable-options",
|
||||
"--output-format",
|
||||
"json"
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
@@ -509,7 +643,11 @@ mod tests {
|
||||
config.toolchain = Some("nightly-2024-06-01".to_string());
|
||||
let step = CargoStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert!(args.contains(&"nightly-2024-06-01"));
|
||||
}
|
||||
|
||||
|
||||
@@ -117,8 +117,7 @@ fn render_module(module_path: &str, items: &[(&Item, &str)], krate: &Crate) -> S
|
||||
items
|
||||
.iter()
|
||||
.find(|(item, kind)| {
|
||||
*kind == "Modules"
|
||||
&& item.name.as_deref() == module_path.split("::").last()
|
||||
*kind == "Modules" && item.name.as_deref() == module_path.split("::").last()
|
||||
})
|
||||
.and_then(|(item, _)| item.docs.as_ref())
|
||||
.map(|d| first_sentence(d))
|
||||
@@ -136,8 +135,15 @@ fn render_module(module_path: &str, items: &[(&Item, &str)], krate: &Crate) -> S
|
||||
}
|
||||
|
||||
let kind_order = [
|
||||
"Modules", "Structs", "Enums", "Traits", "Functions",
|
||||
"Type Aliases", "Constants", "Statics", "Macros",
|
||||
"Modules",
|
||||
"Structs",
|
||||
"Enums",
|
||||
"Traits",
|
||||
"Functions",
|
||||
"Type Aliases",
|
||||
"Constants",
|
||||
"Statics",
|
||||
"Macros",
|
||||
];
|
||||
|
||||
for kind in &kind_order {
|
||||
@@ -266,16 +272,15 @@ fn render_signature(item: &Item, krate: &Crate) -> Option<String> {
|
||||
}
|
||||
Some(sig)
|
||||
}
|
||||
ItemEnum::TypeAlias(ta) => {
|
||||
Some(format!("pub type {name} = {}", render_type(&ta.type_, krate)))
|
||||
}
|
||||
ItemEnum::Constant { type_, const_: c } => {
|
||||
Some(format!(
|
||||
"pub const {name}: {} = {}",
|
||||
render_type(type_, krate),
|
||||
c.value.as_deref().unwrap_or("...")
|
||||
))
|
||||
}
|
||||
ItemEnum::TypeAlias(ta) => Some(format!(
|
||||
"pub type {name} = {}",
|
||||
render_type(&ta.type_, krate)
|
||||
)),
|
||||
ItemEnum::Constant { type_, const_: c } => Some(format!(
|
||||
"pub const {name}: {} = {}",
|
||||
render_type(type_, krate),
|
||||
c.value.as_deref().unwrap_or("...")
|
||||
)),
|
||||
ItemEnum::Macro(_) => Some(format!("macro_rules! {name} {{ ... }}")),
|
||||
_ => None,
|
||||
}
|
||||
@@ -309,7 +314,11 @@ fn render_type(ty: &Type, krate: &Crate) -> String {
|
||||
}
|
||||
Type::Generic(name) => name.clone(),
|
||||
Type::Primitive(name) => name.clone(),
|
||||
Type::BorrowedRef { lifetime, is_mutable, type_ } => {
|
||||
Type::BorrowedRef {
|
||||
lifetime,
|
||||
is_mutable,
|
||||
type_,
|
||||
} => {
|
||||
let mut s = String::from("&");
|
||||
if let Some(lt) = lifetime {
|
||||
s.push_str(lt);
|
||||
@@ -346,7 +355,12 @@ fn render_type(ty: &Type, krate: &Crate) -> String {
|
||||
.collect();
|
||||
format!("impl {}", rendered.join(" + "))
|
||||
}
|
||||
Type::QualifiedPath { name, self_type, trait_, .. } => {
|
||||
Type::QualifiedPath {
|
||||
name,
|
||||
self_type,
|
||||
trait_,
|
||||
..
|
||||
} => {
|
||||
let self_str = render_type(self_type, krate);
|
||||
if let Some(t) = trait_ {
|
||||
format!("<{self_str} as {}>::{name}", t.path)
|
||||
@@ -417,11 +431,17 @@ mod tests {
|
||||
deprecation: None,
|
||||
inner: ItemEnum::Function(Function {
|
||||
sig: FunctionSignature {
|
||||
inputs: params.into_iter().map(|(n, t)| (n.to_string(), t)).collect(),
|
||||
inputs: params
|
||||
.into_iter()
|
||||
.map(|(n, t)| (n.to_string(), t))
|
||||
.collect(),
|
||||
output,
|
||||
is_c_variadic: false,
|
||||
},
|
||||
generics: Generics { params: vec![], where_predicates: vec![] },
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![],
|
||||
},
|
||||
header: FunctionHeader {
|
||||
is_const: false,
|
||||
is_unsafe: false,
|
||||
@@ -446,7 +466,10 @@ mod tests {
|
||||
deprecation: None,
|
||||
inner: ItemEnum::Struct(Struct {
|
||||
kind: StructKind::Unit,
|
||||
generics: Generics { params: vec![], where_predicates: vec![] },
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![],
|
||||
},
|
||||
impls: vec![],
|
||||
}),
|
||||
}
|
||||
@@ -464,7 +487,10 @@ mod tests {
|
||||
attrs: vec![],
|
||||
deprecation: None,
|
||||
inner: ItemEnum::Enum(Enum {
|
||||
generics: Generics { params: vec![], where_predicates: vec![] },
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![],
|
||||
},
|
||||
variants: vec![],
|
||||
has_stripped_variants: false,
|
||||
impls: vec![],
|
||||
@@ -488,7 +514,10 @@ mod tests {
|
||||
is_unsafe: false,
|
||||
is_dyn_compatible: true,
|
||||
items: vec![],
|
||||
generics: Generics { params: vec![], where_predicates: vec![] },
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![],
|
||||
},
|
||||
bounds: vec![],
|
||||
implementations: vec![],
|
||||
}),
|
||||
@@ -540,35 +569,57 @@ mod tests {
|
||||
#[test]
|
||||
fn render_type_tuple() {
|
||||
let krate = empty_crate();
|
||||
let ty = Type::Tuple(vec![Type::Primitive("u32".into()), Type::Primitive("String".into())]);
|
||||
let ty = Type::Tuple(vec![
|
||||
Type::Primitive("u32".into()),
|
||||
Type::Primitive("String".into()),
|
||||
]);
|
||||
assert_eq!(render_type(&ty, &krate), "(u32, String)");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_type_slice() {
|
||||
let krate = empty_crate();
|
||||
assert_eq!(render_type(&Type::Slice(Box::new(Type::Primitive("u8".into()))), &krate), "[u8]");
|
||||
assert_eq!(
|
||||
render_type(&Type::Slice(Box::new(Type::Primitive("u8".into()))), &krate),
|
||||
"[u8]"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_type_array() {
|
||||
let krate = empty_crate();
|
||||
let ty = Type::Array { type_: Box::new(Type::Primitive("u8".into())), len: "32".into() };
|
||||
let ty = Type::Array {
|
||||
type_: Box::new(Type::Primitive("u8".into())),
|
||||
len: "32".into(),
|
||||
};
|
||||
assert_eq!(render_type(&ty, &krate), "[u8; 32]");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_type_raw_pointer() {
|
||||
let krate = empty_crate();
|
||||
let ty = Type::RawPointer { is_mutable: true, type_: Box::new(Type::Primitive("u8".into())) };
|
||||
let ty = Type::RawPointer {
|
||||
is_mutable: true,
|
||||
type_: Box::new(Type::Primitive("u8".into())),
|
||||
};
|
||||
assert_eq!(render_type(&ty, &krate), "*mut u8");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_function_signature() {
|
||||
let krate = empty_crate();
|
||||
let item = make_function("add", vec![("a", Type::Primitive("u32".into())), ("b", Type::Primitive("u32".into()))], Some(Type::Primitive("u32".into())));
|
||||
assert_eq!(render_signature(&item, &krate).unwrap(), "fn add(a: u32, b: u32) -> u32");
|
||||
let item = make_function(
|
||||
"add",
|
||||
vec![
|
||||
("a", Type::Primitive("u32".into())),
|
||||
("b", Type::Primitive("u32".into())),
|
||||
],
|
||||
Some(Type::Primitive("u32".into())),
|
||||
);
|
||||
assert_eq!(
|
||||
render_signature(&item, &krate).unwrap(),
|
||||
"fn add(a: u32, b: u32) -> u32"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -581,25 +632,51 @@ mod tests {
|
||||
#[test]
|
||||
fn render_struct_signature() {
|
||||
let krate = empty_crate();
|
||||
assert_eq!(render_signature(&make_struct("MyStruct"), &krate).unwrap(), "pub struct MyStruct;");
|
||||
assert_eq!(
|
||||
render_signature(&make_struct("MyStruct"), &krate).unwrap(),
|
||||
"pub struct MyStruct;"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_enum_signature() {
|
||||
let krate = empty_crate();
|
||||
assert_eq!(render_signature(&make_enum("Color"), &krate).unwrap(), "pub enum Color { }");
|
||||
assert_eq!(
|
||||
render_signature(&make_enum("Color"), &krate).unwrap(),
|
||||
"pub enum Color { }"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_trait_signature() {
|
||||
let krate = empty_crate();
|
||||
assert_eq!(render_signature(&make_trait("Drawable"), &krate).unwrap(), "pub trait Drawable");
|
||||
assert_eq!(
|
||||
render_signature(&make_trait("Drawable"), &krate).unwrap(),
|
||||
"pub trait Drawable"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn item_kind_labels() {
|
||||
assert_eq!(item_kind_label(&ItemEnum::Module(Module { is_crate: false, items: vec![], is_stripped: false })), Some("Modules"));
|
||||
assert_eq!(item_kind_label(&ItemEnum::Struct(Struct { kind: StructKind::Unit, generics: Generics { params: vec![], where_predicates: vec![] }, impls: vec![] })), Some("Structs"));
|
||||
assert_eq!(
|
||||
item_kind_label(&ItemEnum::Module(Module {
|
||||
is_crate: false,
|
||||
items: vec![],
|
||||
is_stripped: false
|
||||
})),
|
||||
Some("Modules")
|
||||
);
|
||||
assert_eq!(
|
||||
item_kind_label(&ItemEnum::Struct(Struct {
|
||||
kind: StructKind::Unit,
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![]
|
||||
},
|
||||
impls: vec![]
|
||||
})),
|
||||
Some("Structs")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -613,7 +690,14 @@ mod tests {
|
||||
let func = make_function("hello", vec![], None);
|
||||
let id = Id(1);
|
||||
krate.index.insert(id.clone(), func);
|
||||
krate.paths.insert(id, ItemSummary { crate_id: 0, path: vec!["my_crate".into(), "hello".into()], kind: ItemKind::Function });
|
||||
krate.paths.insert(
|
||||
id,
|
||||
ItemSummary {
|
||||
crate_id: 0,
|
||||
path: vec!["my_crate".into(), "hello".into()],
|
||||
kind: ItemKind::Function,
|
||||
},
|
||||
);
|
||||
|
||||
let files = transform_to_mdx(&krate);
|
||||
assert_eq!(files.len(), 1);
|
||||
@@ -628,11 +712,25 @@ mod tests {
|
||||
let mut krate = empty_crate();
|
||||
let func = make_function("do_thing", vec![], None);
|
||||
krate.index.insert(Id(1), func);
|
||||
krate.paths.insert(Id(1), ItemSummary { crate_id: 0, path: vec!["mc".into(), "do_thing".into()], kind: ItemKind::Function });
|
||||
krate.paths.insert(
|
||||
Id(1),
|
||||
ItemSummary {
|
||||
crate_id: 0,
|
||||
path: vec!["mc".into(), "do_thing".into()],
|
||||
kind: ItemKind::Function,
|
||||
},
|
||||
);
|
||||
|
||||
let st = make_struct("Widget");
|
||||
krate.index.insert(Id(2), st);
|
||||
krate.paths.insert(Id(2), ItemSummary { crate_id: 0, path: vec!["mc".into(), "Widget".into()], kind: ItemKind::Struct });
|
||||
krate.paths.insert(
|
||||
Id(2),
|
||||
ItemSummary {
|
||||
crate_id: 0,
|
||||
path: vec!["mc".into(), "Widget".into()],
|
||||
kind: ItemKind::Struct,
|
||||
},
|
||||
);
|
||||
|
||||
let files = transform_to_mdx(&krate);
|
||||
assert_eq!(files.len(), 1);
|
||||
@@ -654,7 +752,11 @@ mod tests {
|
||||
links: HashMap::new(),
|
||||
attrs: vec![],
|
||||
deprecation: None,
|
||||
inner: ItemEnum::Module(Module { is_crate: true, items: vec![Id(1)], is_stripped: false }),
|
||||
inner: ItemEnum::Module(Module {
|
||||
is_crate: true,
|
||||
items: vec![Id(1)],
|
||||
is_stripped: false,
|
||||
}),
|
||||
};
|
||||
krate.root = Id(0);
|
||||
krate.index.insert(Id(0), root_module);
|
||||
@@ -662,12 +764,23 @@ mod tests {
|
||||
// Add a function so the module generates a file.
|
||||
let func = make_function("f", vec![], None);
|
||||
krate.index.insert(Id(1), func);
|
||||
krate.paths.insert(Id(1), ItemSummary { crate_id: 0, path: vec!["f".into()], kind: ItemKind::Function });
|
||||
krate.paths.insert(
|
||||
Id(1),
|
||||
ItemSummary {
|
||||
crate_id: 0,
|
||||
path: vec!["f".into()],
|
||||
kind: ItemKind::Function,
|
||||
},
|
||||
);
|
||||
|
||||
let files = transform_to_mdx(&krate);
|
||||
// The root module's description in frontmatter should have escaped quotes.
|
||||
let index = files.iter().find(|f| f.path == "index.mdx").unwrap();
|
||||
assert!(index.content.contains("\\\"quoted\\\""), "content: {}", index.content);
|
||||
assert!(
|
||||
index.content.contains("\\\"quoted\\\""),
|
||||
"content: {}",
|
||||
index.content
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -677,7 +790,9 @@ mod tests {
|
||||
path: "Option".into(),
|
||||
id: Id(99),
|
||||
args: Some(Box::new(rustdoc_types::GenericArgs::AngleBracketed {
|
||||
args: vec![rustdoc_types::GenericArg::Type(Type::Primitive("u32".into()))],
|
||||
args: vec![rustdoc_types::GenericArg::Type(Type::Primitive(
|
||||
"u32".into(),
|
||||
))],
|
||||
constraints: vec![],
|
||||
})),
|
||||
});
|
||||
@@ -687,13 +802,15 @@ mod tests {
|
||||
#[test]
|
||||
fn render_type_impl_trait() {
|
||||
let krate = empty_crate();
|
||||
let ty = Type::ImplTrait(vec![
|
||||
rustdoc_types::GenericBound::TraitBound {
|
||||
trait_: rustdoc_types::Path { path: "Display".into(), id: Id(99), args: None },
|
||||
generic_params: vec![],
|
||||
modifier: rustdoc_types::TraitBoundModifier::None,
|
||||
let ty = Type::ImplTrait(vec![rustdoc_types::GenericBound::TraitBound {
|
||||
trait_: rustdoc_types::Path {
|
||||
path: "Display".into(),
|
||||
id: Id(99),
|
||||
args: None,
|
||||
},
|
||||
]);
|
||||
generic_params: vec![],
|
||||
modifier: rustdoc_types::TraitBoundModifier::None,
|
||||
}]);
|
||||
assert_eq!(render_type(&ty, &krate), "impl Display");
|
||||
}
|
||||
|
||||
@@ -702,7 +819,11 @@ mod tests {
|
||||
let krate = empty_crate();
|
||||
let ty = Type::DynTrait(rustdoc_types::DynTrait {
|
||||
traits: vec![rustdoc_types::PolyTrait {
|
||||
trait_: rustdoc_types::Path { path: "Error".into(), id: Id(99), args: None },
|
||||
trait_: rustdoc_types::Path {
|
||||
path: "Error".into(),
|
||||
id: Id(99),
|
||||
args: None,
|
||||
},
|
||||
generic_params: vec![],
|
||||
}],
|
||||
lifetime: None,
|
||||
@@ -720,7 +841,12 @@ mod tests {
|
||||
is_c_variadic: false,
|
||||
},
|
||||
generic_params: vec![],
|
||||
header: FunctionHeader { is_const: false, is_unsafe: false, is_async: false, abi: Abi::Rust },
|
||||
header: FunctionHeader {
|
||||
is_const: false,
|
||||
is_unsafe: false,
|
||||
is_async: false,
|
||||
abi: Abi::Rust,
|
||||
},
|
||||
}));
|
||||
assert_eq!(render_type(&ty, &krate), "fn(u32) -> bool");
|
||||
}
|
||||
@@ -728,7 +854,10 @@ mod tests {
|
||||
#[test]
|
||||
fn render_type_const_pointer() {
|
||||
let krate = empty_crate();
|
||||
let ty = Type::RawPointer { is_mutable: false, type_: Box::new(Type::Primitive("u8".into())) };
|
||||
let ty = Type::RawPointer {
|
||||
is_mutable: false,
|
||||
type_: Box::new(Type::Primitive("u8".into())),
|
||||
};
|
||||
assert_eq!(render_type(&ty, &krate), "*const u8");
|
||||
}
|
||||
|
||||
@@ -743,9 +872,16 @@ mod tests {
|
||||
let krate = empty_crate();
|
||||
let ty = Type::QualifiedPath {
|
||||
name: "Item".into(),
|
||||
args: Box::new(rustdoc_types::GenericArgs::AngleBracketed { args: vec![], constraints: vec![] }),
|
||||
args: Box::new(rustdoc_types::GenericArgs::AngleBracketed {
|
||||
args: vec![],
|
||||
constraints: vec![],
|
||||
}),
|
||||
self_type: Box::new(Type::Generic("T".into())),
|
||||
trait_: Some(rustdoc_types::Path { path: "Iterator".into(), id: Id(99), args: None }),
|
||||
trait_: Some(rustdoc_types::Path {
|
||||
path: "Iterator".into(),
|
||||
id: Id(99),
|
||||
args: None,
|
||||
}),
|
||||
};
|
||||
assert_eq!(render_type(&ty, &krate), "<T as Iterator>::Item");
|
||||
}
|
||||
@@ -753,74 +889,137 @@ mod tests {
|
||||
#[test]
|
||||
fn item_kind_label_all_variants() {
|
||||
// Test the remaining untested variants
|
||||
assert_eq!(item_kind_label(&ItemEnum::Enum(Enum {
|
||||
generics: Generics { params: vec![], where_predicates: vec![] },
|
||||
variants: vec![], has_stripped_variants: false, impls: vec![],
|
||||
})), Some("Enums"));
|
||||
assert_eq!(item_kind_label(&ItemEnum::Trait(Trait {
|
||||
is_auto: false, is_unsafe: false, is_dyn_compatible: true,
|
||||
items: vec![], generics: Generics { params: vec![], where_predicates: vec![] },
|
||||
bounds: vec![], implementations: vec![],
|
||||
})), Some("Traits"));
|
||||
assert_eq!(
|
||||
item_kind_label(&ItemEnum::Enum(Enum {
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![]
|
||||
},
|
||||
variants: vec![],
|
||||
has_stripped_variants: false,
|
||||
impls: vec![],
|
||||
})),
|
||||
Some("Enums")
|
||||
);
|
||||
assert_eq!(
|
||||
item_kind_label(&ItemEnum::Trait(Trait {
|
||||
is_auto: false,
|
||||
is_unsafe: false,
|
||||
is_dyn_compatible: true,
|
||||
items: vec![],
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![]
|
||||
},
|
||||
bounds: vec![],
|
||||
implementations: vec![],
|
||||
})),
|
||||
Some("Traits")
|
||||
);
|
||||
assert_eq!(item_kind_label(&ItemEnum::Macro("".into())), Some("Macros"));
|
||||
assert_eq!(item_kind_label(&ItemEnum::Static(rustdoc_types::Static {
|
||||
type_: Type::Primitive("u32".into()),
|
||||
is_mutable: false,
|
||||
is_unsafe: false,
|
||||
expr: String::new(),
|
||||
})), Some("Statics"));
|
||||
assert_eq!(
|
||||
item_kind_label(&ItemEnum::Static(rustdoc_types::Static {
|
||||
type_: Type::Primitive("u32".into()),
|
||||
is_mutable: false,
|
||||
is_unsafe: false,
|
||||
expr: String::new(),
|
||||
})),
|
||||
Some("Statics")
|
||||
);
|
||||
// Impl blocks should be skipped
|
||||
assert_eq!(item_kind_label(&ItemEnum::Impl(rustdoc_types::Impl {
|
||||
is_unsafe: false, generics: Generics { params: vec![], where_predicates: vec![] },
|
||||
provided_trait_methods: vec![], trait_: None, for_: Type::Primitive("u32".into()),
|
||||
items: vec![], is_negative: false, is_synthetic: false,
|
||||
blanket_impl: None,
|
||||
})), None);
|
||||
assert_eq!(
|
||||
item_kind_label(&ItemEnum::Impl(rustdoc_types::Impl {
|
||||
is_unsafe: false,
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![]
|
||||
},
|
||||
provided_trait_methods: vec![],
|
||||
trait_: None,
|
||||
for_: Type::Primitive("u32".into()),
|
||||
items: vec![],
|
||||
is_negative: false,
|
||||
is_synthetic: false,
|
||||
blanket_impl: None,
|
||||
})),
|
||||
None
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_constant_signature() {
|
||||
let krate = empty_crate();
|
||||
let item = Item {
|
||||
id: Id(5), crate_id: 0,
|
||||
name: Some("MAX_SIZE".into()), span: None,
|
||||
visibility: Visibility::Public, docs: None,
|
||||
links: HashMap::new(), attrs: vec![], deprecation: None,
|
||||
id: Id(5),
|
||||
crate_id: 0,
|
||||
name: Some("MAX_SIZE".into()),
|
||||
span: None,
|
||||
visibility: Visibility::Public,
|
||||
docs: None,
|
||||
links: HashMap::new(),
|
||||
attrs: vec![],
|
||||
deprecation: None,
|
||||
inner: ItemEnum::Constant {
|
||||
type_: Type::Primitive("usize".into()),
|
||||
const_: rustdoc_types::Constant { expr: "1024".into(), value: Some("1024".into()), is_literal: true },
|
||||
const_: rustdoc_types::Constant {
|
||||
expr: "1024".into(),
|
||||
value: Some("1024".into()),
|
||||
is_literal: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
assert_eq!(render_signature(&item, &krate).unwrap(), "pub const MAX_SIZE: usize = 1024");
|
||||
assert_eq!(
|
||||
render_signature(&item, &krate).unwrap(),
|
||||
"pub const MAX_SIZE: usize = 1024"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_type_alias_signature() {
|
||||
let krate = empty_crate();
|
||||
let item = Item {
|
||||
id: Id(6), crate_id: 0,
|
||||
name: Some("Result".into()), span: None,
|
||||
visibility: Visibility::Public, docs: None,
|
||||
links: HashMap::new(), attrs: vec![], deprecation: None,
|
||||
id: Id(6),
|
||||
crate_id: 0,
|
||||
name: Some("Result".into()),
|
||||
span: None,
|
||||
visibility: Visibility::Public,
|
||||
docs: None,
|
||||
links: HashMap::new(),
|
||||
attrs: vec![],
|
||||
deprecation: None,
|
||||
inner: ItemEnum::TypeAlias(rustdoc_types::TypeAlias {
|
||||
type_: Type::Primitive("u32".into()),
|
||||
generics: Generics { params: vec![], where_predicates: vec![] },
|
||||
generics: Generics {
|
||||
params: vec![],
|
||||
where_predicates: vec![],
|
||||
},
|
||||
}),
|
||||
};
|
||||
assert_eq!(render_signature(&item, &krate).unwrap(), "pub type Result = u32");
|
||||
assert_eq!(
|
||||
render_signature(&item, &krate).unwrap(),
|
||||
"pub type Result = u32"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_macro_signature() {
|
||||
let krate = empty_crate();
|
||||
let item = Item {
|
||||
id: Id(7), crate_id: 0,
|
||||
name: Some("my_macro".into()), span: None,
|
||||
visibility: Visibility::Public, docs: None,
|
||||
links: HashMap::new(), attrs: vec![], deprecation: None,
|
||||
id: Id(7),
|
||||
crate_id: 0,
|
||||
name: Some("my_macro".into()),
|
||||
span: None,
|
||||
visibility: Visibility::Public,
|
||||
docs: None,
|
||||
links: HashMap::new(),
|
||||
attrs: vec![],
|
||||
deprecation: None,
|
||||
inner: ItemEnum::Macro("macro body".into()),
|
||||
};
|
||||
assert_eq!(render_signature(&item, &krate).unwrap(), "macro_rules! my_macro { ... }");
|
||||
assert_eq!(
|
||||
render_signature(&item, &krate).unwrap(),
|
||||
"macro_rules! my_macro { ... }"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -839,9 +1038,15 @@ mod tests {
|
||||
#[test]
|
||||
fn write_mdx_files_creates_directories() {
|
||||
let tmp = tempfile::tempdir().unwrap();
|
||||
let files = vec![MdxFile { path: "nested/module.mdx".into(), content: "# Test\n".into() }];
|
||||
let files = vec![MdxFile {
|
||||
path: "nested/module.mdx".into(),
|
||||
content: "# Test\n".into(),
|
||||
}];
|
||||
write_mdx_files(&files, tmp.path()).unwrap();
|
||||
assert!(tmp.path().join("nested/module.mdx").exists());
|
||||
assert_eq!(std::fs::read_to_string(tmp.path().join("nested/module.mdx")).unwrap(), "# Test\n");
|
||||
assert_eq!(
|
||||
std::fs::read_to_string(tmp.path().join("nested/module.mdx")).unwrap(),
|
||||
"# Test\n"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,10 @@ mod tests {
|
||||
#[test]
|
||||
fn command_as_str() {
|
||||
assert_eq!(RustupCommand::Install.as_str(), "install");
|
||||
assert_eq!(RustupCommand::ToolchainInstall.as_str(), "toolchain-install");
|
||||
assert_eq!(
|
||||
RustupCommand::ToolchainInstall.as_str(),
|
||||
"toolchain-install"
|
||||
);
|
||||
assert_eq!(RustupCommand::ComponentAdd.as_str(), "component-add");
|
||||
assert_eq!(RustupCommand::TargetAdd.as_str(), "target-add");
|
||||
}
|
||||
@@ -118,7 +121,11 @@ mod tests {
|
||||
let config = RustupConfig {
|
||||
command: RustupCommand::ComponentAdd,
|
||||
toolchain: Some("nightly".to_string()),
|
||||
components: vec!["clippy".to_string(), "rustfmt".to_string(), "rust-src".to_string()],
|
||||
components: vec![
|
||||
"clippy".to_string(),
|
||||
"rustfmt".to_string(),
|
||||
"rust-src".to_string(),
|
||||
],
|
||||
targets: vec![],
|
||||
profile: None,
|
||||
default_toolchain: None,
|
||||
@@ -138,7 +145,10 @@ mod tests {
|
||||
command: RustupCommand::TargetAdd,
|
||||
toolchain: Some("stable".to_string()),
|
||||
components: vec![],
|
||||
targets: vec!["wasm32-unknown-unknown".to_string(), "aarch64-linux-android".to_string()],
|
||||
targets: vec![
|
||||
"wasm32-unknown-unknown".to_string(),
|
||||
"aarch64-linux-android".to_string(),
|
||||
],
|
||||
profile: None,
|
||||
default_toolchain: None,
|
||||
extra_args: vec![],
|
||||
@@ -147,7 +157,10 @@ mod tests {
|
||||
let json = serde_json::to_string(&config).unwrap();
|
||||
let de: RustupConfig = serde_json::from_str(&json).unwrap();
|
||||
assert_eq!(de.command, RustupCommand::TargetAdd);
|
||||
assert_eq!(de.targets, vec!["wasm32-unknown-unknown", "aarch64-linux-android"]);
|
||||
assert_eq!(
|
||||
de.targets,
|
||||
vec!["wasm32-unknown-unknown", "aarch64-linux-android"]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use async_trait::async_trait;
|
||||
use wfe_core::WfeError;
|
||||
use wfe_core::models::ExecutionResult;
|
||||
use wfe_core::traits::step::{StepBody, StepExecutionContext};
|
||||
use wfe_core::WfeError;
|
||||
|
||||
use crate::rustup::config::{RustupCommand, RustupConfig};
|
||||
|
||||
@@ -26,7 +26,8 @@ impl RustupStep {
|
||||
fn build_install_command(&self) -> tokio::process::Command {
|
||||
let mut cmd = tokio::process::Command::new("sh");
|
||||
// Pipe rustup-init through sh with non-interactive flag.
|
||||
let mut script = "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y".to_string();
|
||||
let mut script =
|
||||
"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y".to_string();
|
||||
|
||||
if let Some(ref profile) = self.config.profile {
|
||||
script.push_str(&format!(" --profile {profile}"));
|
||||
@@ -112,7 +113,10 @@ impl RustupStep {
|
||||
|
||||
#[async_trait]
|
||||
impl StepBody for RustupStep {
|
||||
async fn run(&mut self, context: &StepExecutionContext<'_>) -> wfe_core::Result<ExecutionResult> {
|
||||
async fn run(
|
||||
&mut self,
|
||||
context: &StepExecutionContext<'_>,
|
||||
) -> wfe_core::Result<ExecutionResult> {
|
||||
let step_name = context.step.name.as_deref().unwrap_or("unknown");
|
||||
let subcmd = self.config.command.as_str();
|
||||
|
||||
@@ -133,9 +137,9 @@ impl StepBody for RustupStep {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cmd.output()
|
||||
.await
|
||||
.map_err(|e| WfeError::StepExecution(format!("Failed to spawn rustup {subcmd}: {e}")))?
|
||||
cmd.output().await.map_err(|e| {
|
||||
WfeError::StepExecution(format!("Failed to spawn rustup {subcmd}: {e}"))
|
||||
})?
|
||||
};
|
||||
|
||||
let stdout = String::from_utf8_lossy(&output.stdout).to_string();
|
||||
@@ -189,7 +193,11 @@ mod tests {
|
||||
let cmd = step.build_command();
|
||||
let prog = cmd.as_std().get_program().to_str().unwrap();
|
||||
assert_eq!(prog, "sh");
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args[0], "-c");
|
||||
assert!(args[1].contains("rustup.rs"));
|
||||
assert!(args[1].contains("-y"));
|
||||
@@ -202,7 +210,11 @@ mod tests {
|
||||
config.default_toolchain = Some("nightly".to_string());
|
||||
let step = RustupStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert!(args[1].contains("--profile minimal"));
|
||||
assert!(args[1].contains("--default-toolchain nightly"));
|
||||
}
|
||||
@@ -213,7 +225,11 @@ mod tests {
|
||||
config.extra_args = vec!["--no-modify-path".to_string()];
|
||||
let step = RustupStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert!(args[1].contains("--no-modify-path"));
|
||||
}
|
||||
|
||||
@@ -233,8 +249,21 @@ mod tests {
|
||||
let cmd = step.build_command();
|
||||
let prog = cmd.as_std().get_program().to_str().unwrap();
|
||||
assert_eq!(prog, "rustup");
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
assert_eq!(args, vec!["toolchain", "install", "nightly-2024-06-01", "--profile", "minimal"]);
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
"toolchain",
|
||||
"install",
|
||||
"nightly-2024-06-01",
|
||||
"--profile",
|
||||
"minimal"
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -251,7 +280,11 @@ mod tests {
|
||||
};
|
||||
let step = RustupStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["toolchain", "install", "stable", "--force"]);
|
||||
}
|
||||
|
||||
@@ -271,8 +304,22 @@ mod tests {
|
||||
let cmd = step.build_command();
|
||||
let prog = cmd.as_std().get_program().to_str().unwrap();
|
||||
assert_eq!(prog, "rustup");
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
assert_eq!(args, vec!["component", "add", "clippy", "rustfmt", "--toolchain", "nightly"]);
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
"component",
|
||||
"add",
|
||||
"clippy",
|
||||
"rustfmt",
|
||||
"--toolchain",
|
||||
"nightly"
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -289,7 +336,11 @@ mod tests {
|
||||
};
|
||||
let step = RustupStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(args, vec!["component", "add", "rust-src"]);
|
||||
}
|
||||
|
||||
@@ -309,8 +360,21 @@ mod tests {
|
||||
let cmd = step.build_command();
|
||||
let prog = cmd.as_std().get_program().to_str().unwrap();
|
||||
assert_eq!(prog, "rustup");
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
assert_eq!(args, vec!["target", "add", "wasm32-unknown-unknown", "--toolchain", "stable"]);
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
"target",
|
||||
"add",
|
||||
"wasm32-unknown-unknown",
|
||||
"--toolchain",
|
||||
"stable"
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -330,8 +394,20 @@ mod tests {
|
||||
};
|
||||
let step = RustupStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
assert_eq!(args, vec!["target", "add", "wasm32-unknown-unknown", "aarch64-linux-android"]);
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec![
|
||||
"target",
|
||||
"add",
|
||||
"wasm32-unknown-unknown",
|
||||
"aarch64-linux-android"
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -348,10 +424,21 @@ mod tests {
|
||||
};
|
||||
let step = RustupStep::new(config);
|
||||
let cmd = step.build_command();
|
||||
let args: Vec<_> = cmd.as_std().get_args().map(|a| a.to_str().unwrap()).collect();
|
||||
let args: Vec<_> = cmd
|
||||
.as_std()
|
||||
.get_args()
|
||||
.map(|a| a.to_str().unwrap())
|
||||
.collect();
|
||||
assert_eq!(
|
||||
args,
|
||||
vec!["target", "add", "x86_64-unknown-linux-musl", "--toolchain", "nightly", "--force"]
|
||||
vec![
|
||||
"target",
|
||||
"add",
|
||||
"x86_64-unknown-linux-musl",
|
||||
"--toolchain",
|
||||
"nightly",
|
||||
"--force"
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user