use xshell::Shell;
use crate::environment::{cargo_cmd, get_workspace_packages, CmdExt, ProgressGuard};
use crate::lock::LockFile;
use crate::toolchain::{prepare_toolchain, Toolchain};
#[derive(Debug, Clone, Copy)]
pub enum DocsMode {
Docs,
DocsRs,
}
impl DocsMode {
fn toolchain(self) -> Toolchain {
match self {
Self::Docs => Toolchain::Stable,
Self::DocsRs => Toolchain::Nightly,
}
}
fn rustdocflags(self) -> &'static str {
match self {
Self::Docs => "-D warnings",
Self::DocsRs => "--cfg docsrs -D warnings -D rustdoc::broken-intra-doc-links",
}
}
}
pub fn run(
sh: &Shell,
lockfile: LockFile,
packages: &[String],
mode: DocsMode,
open: bool,
) -> Result<(), Box<dyn std::error::Error>> {
let packages = get_workspace_packages(sh, packages)?;
let _lockfile_guard = lockfile.activate(sh)?;
let _progress = ProgressGuard::new();
prepare_toolchain(sh, mode.toolchain())?;
rbmt_eprintln!("Building docs...");
let mut cmd = cargo_cmd(sh)
.arg("doc")
.arg("--all-features")
.arg("--no-deps")
.env("RUSTDOCFLAGS", mode.rustdocflags());
for package in packages {
cmd = cmd.args(&["-p", &package.id]);
}
if open {
cmd = cmd.arg("--open");
}
cmd.run_with_capture()?;
rbmt_eprintln!("Docs built successfully.");
Ok(())
}