xtask/commands/
rextendr_document.rs

1//! This invokes `rextendr::document()` within `tests/extendrtests`.
2//!
3//! It uses the vendored `rextendr` in the repository as the source package.
4//!
5//! 1. Ensure that `git submodule update --init` was invoked once, as to setup
6//! the vendored `rextendr` package.
7//! 2. `devtools` must be installed on system.
8//!
9//!
10//! The idea here is to be able to develop `rextendr` alongside `extendr`,
11//! as well as ease the development of extendr.
12//!
13use std::error::Error;
14
15use crate::extendrtests::with_absolute_path::{swap_extendr_api_path, R_FOLDER_PATH};
16use xshell::{cmd, Shell};
17
18pub(crate) fn run(shell: &Shell) -> Result<(), Box<dyn Error>> {
19    let _document_handle = swap_extendr_api_path(shell)?;
20
21    run_rextendr_document(shell)
22}
23
24fn run_rextendr_document(shell: &Shell) -> Result<(), Box<dyn Error>> {
25    let _r_path = shell.push_dir(R_FOLDER_PATH);
26
27    let rextendr_submodule = std::path::Path::new(".../../rextendr");
28    let rextendr_submodule = matches!(rextendr_submodule.try_exists(), Ok(true));
29    if rextendr_submodule {
30        println!("Loading vendored `{{rextendr}}`");
31        cmd!(shell, "Rscript")
32            .args([
33                "-e",
34                r#"requireNamespace("devtools")"#,
35                "-e",
36                r#"devtools::load_all("../../rextendr")"#,
37                "-e",
38                r#"rextendr::document()"#,
39            ])
40            .run()?;
41    } else {
42        // check if rextendr is installed and use that instead
43        println!("Using installed `{{rextendr}}`");
44        cmd!(shell, "Rscript")
45            .args([
46                "-e",
47                r#"requireNamespace("rextendr")"#,
48                "-e",
49                r#"rextendr::document()"#,
50            ])
51            .run()?;
52    }
53
54    Ok(())
55}