Nothing
# This is a duplicate of `utils.R` from `galaxias`, taken on 2025-05-12
# https://github.com/AtlasOfLivingAustralia/galaxias/blob/development/R/utils.R
#' Interactive menu function
#' @description
#' Built on top of utils::menu().
#' Originally proposed by Hadley here: https://github.com/r-lib/cli/issues/228#issuecomment-1453614104
#' Full code from gargle here: https://github.com/r-lib/gargle/blob/main/R/utils-ui.R
#' @noRd
#' @keywords Internal
cli_menu <- function(header,
prompt,
choices,
file,
not_interactive = choices,
exit = integer(),
.envir = rlang::caller_env(),
error_call = rlang::caller_env()) {
if (!rlang::is_interactive()) {
cli::cli_abort(
c(header, not_interactive),
.envir = .envir,
call = error_call
)
}
choices <- paste0(cli::style_bold(seq_along(choices)), ": ", choices)
cli::cli_inform(
c(header, prompt, choices),
.envir = .envir
)
repeat {
selected <- cli_readline("Selection: ")
if (selected %in% c("0", seq_along(choices))) {
break
}
cli::cli_inform(
"Enter a number between 1 and {length(choices)}, or enter 0 to exit."
)
}
selected <- as.integer(selected)
if (selected %in% c(0, exit)) {
if (is_testing()) {
cli::cli_abort("Exiting...", call = NULL)
} else {
cli::cli_alert_danger("Exiting...")
# simulate user pressing Ctrl + C
invokeRestart("abort")
}
}
selected
}
#' Interactive readLines
#' @description
#' Allows for interactive testing of `cli_menu()` selection.
#' Originally proposed by Hadley here: https://github.com/r-lib/cli/issues/228#issuecomment-1453614104.
#' Full code from gargle here: https://github.com/r-lib/gargle/blob/main/R/utils-ui.R
#' @noRd
#' @keywords Internal
cli_readline <- function(prompt) {
local_input <- getOption("cli_input", character())
# not convinced that we need to plan for multiple mocked inputs, but leaving
# this feature in for now
if (length(local_input) > 0) {
input <- local_input[[1]]
cli::cli_inform(paste0(prompt, input))
options(cli_input = local_input[-1])
input
} else {
readline(prompt)
}
}
local_user_input <- function(x, env = rlang::caller_env()) {
withr::local_options(
rlang_interactive = TRUE,
# trailing 0 prevents infinite loop if x only contains invalid choices
cli_input = c(x, "0"),
.local_envir = env
)
}
is_testing <- function() {
identical(Sys.getenv("TESTTHAT"), "true")
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.