r-lib / cli

Tools for making beautiful & useful command line interfaces
https://cli.r-lib.org/
Other
644 stars 70 forks source link

Adding "last" argument to `cli_abort` #675

Closed njtierney closed 3 months ago

njtierney commented 6 months ago

Hello!

Thanks again for maintaining cli, I feel like I am still discovering nice new features all the time (like diff_chr and diff_str recently!).

I'm wondering if there is an argument to be had for a "last" argument to cli_abort and friends?

Currently the output is limited to using "and".

I can use rlang::arg_match to solve this particular problem, but it feels like a last argument could be something that is more generally useful?

check_valid_fruit <- function(fruit) {
  valid_fruits <- c("apples", "bananas")
  is_valid_fruit <- fruit %in% valid_fruits
  if (!is_valid_fruit) {
    cli::cli_abort(
      message = "{.var {fruit}} must be one of {.var {valid_fruits}}"
      # potential argument option?
      # .last = "or"
    )
  }
}

check_valid_fruit("apples")
check_valid_fruit("lemons")
#> Error in `check_valid_fruit()`:
#> ! `lemons` must be one of `apples` and `bananas`

# this does what I want, but sometimes we don't always want to use 
# arg matching?
check_valid_fruit_arg <- function(fruit) {
  rlang::arg_match0(fruit, c("apples", "bananas"))
}

check_valid_fruit_arg("apples")
#> [1] "apples"
check_valid_fruit_arg("lemons")
#> Error in `check_valid_fruit_arg()`:
#> ! `fruit` must be one of "apples" or "bananas", not "lemons".

Created on 2024-03-12 with reprex v2.1.0

Session info ``` r sessioninfo::session_info() #> ─ Session info ─────────────────────────────────────────────────────────────── #> setting value #> version R version 4.3.3 (2024-02-29) #> os macOS Sonoma 14.3.1 #> system aarch64, darwin20 #> ui X11 #> language (EN) #> collate en_US.UTF-8 #> ctype en_US.UTF-8 #> tz Australia/Hobart #> date 2024-03-12 #> pandoc 3.1.1 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown) #> #> ─ Packages ─────────────────────────────────────────────────────────────────── #> package * version date (UTC) lib source #> cli 3.6.2 2023-12-11 [1] CRAN (R 4.3.1) #> digest 0.6.34 2024-01-11 [1] CRAN (R 4.3.1) #> evaluate 0.23 2023-11-01 [1] CRAN (R 4.3.1) #> fansi 1.0.6 2023-12-08 [1] CRAN (R 4.3.1) #> fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.0) #> fs 1.6.3 2023-07-20 [1] CRAN (R 4.3.0) #> glue 1.7.0 2024-01-09 [1] CRAN (R 4.3.1) #> htmltools 0.5.7 2023-11-03 [1] CRAN (R 4.3.1) #> knitr 1.45 2023-10-30 [1] CRAN (R 4.3.1) #> lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.3.1) #> magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.0) #> pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.0) #> purrr 1.0.2 2023-08-10 [1] CRAN (R 4.3.0) #> R.cache 0.16.0 2022-07-21 [2] CRAN (R 4.3.0) #> R.methodsS3 1.8.2 2022-06-13 [2] CRAN (R 4.3.0) #> R.oo 1.26.0 2024-01-24 [2] CRAN (R 4.3.1) #> R.utils 2.12.3 2023-11-18 [2] CRAN (R 4.3.1) #> reprex 2.1.0 2024-01-11 [2] CRAN (R 4.3.1) #> rlang 1.1.3 2024-01-10 [1] CRAN (R 4.3.1) #> rmarkdown 2.25 2023-09-18 [1] CRAN (R 4.3.1) #> rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.0) #> sessioninfo 1.2.2 2021-12-06 [2] CRAN (R 4.3.0) #> styler 1.10.2 2023-08-29 [2] CRAN (R 4.3.0) #> utf8 1.2.4 2023-10-22 [1] CRAN (R 4.3.1) #> vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.3.1) #> withr 3.0.0 2024-01-16 [1] CRAN (R 4.3.1) #> xfun 0.42 2024-02-08 [1] CRAN (R 4.3.1) #> yaml 2.3.8 2023-12-11 [1] CRAN (R 4.3.1) #> #> [1] /Users/nick/Library/R/arm64/4.3/library #> [2] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library #> #> ────────────────────────────────────────────────────────────────────────────── ```

Initially posted about this here: https://community.rstudio.com/t/cli-package-using-or-instead-of-and-as-last-separator/183142/4

gaborcsardi commented 3 months ago

You can already do this:

fruit <- "fruit"
valid_fruits <- letters[1:4]
cli::cli_abort(
  message = "{.var {fruit}} must be one of {.or {.var {valid_fruits}}}"
)
Error:
! `fruit` must be one of `a`, `b`, `c`, or `d`
Run `rlang::last_trace()` to see where the error occurred.
njtierney commented 3 months ago

Ah, that's awesome! I didn't know about {.or } - thanks, @gaborcsardi !