knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.path = "man/figures/README-",
  out.width = "100%"
)

valid

Lifecycle: experimental CRAN status

Installation

# install.packages("remotes")
remotes::install_github("rappster/valid")

What?

Helpers for facilitating systematic input validation

Why?

Input validation is tedious already. This package hopefully provides some functionality to make the task a bit easier or at least more fun.

How?

library(valid)

The actual workhorse is valid() while valid2() makes choice input a bit more convenient via the ... mechanism.

Built-in functions

There are some built-in functions for typical validation tasks.

The number of such built-in functions will grow over time in a "scratch my own itch" manner

valid_authentication()
valid_authentication("https")
valid_authentication(2)
try(valid_authentication("I don't exist"))
try(valid_authentication(3))

valid_dep_types()
valid_dep_types("Suggests")
try(valid_dep_types("I don't exist"))

valid_devops_envs()
valid_devops_envs("staging")
try(valid_devops_envs("I don't exist"))

valid_licenses()
valid_licenses("mit")
try(valid_licenses("I don't exist"))

valid_yes_no()
valid_again_exit()
valid_yes_no_again_exit()
valid_keep_reset()
valid_keep_reset_again_exit()

Storage

valid_storage_remote()
valid_storage_remote("gcp_s3")
valid_storage_remote("gcp_cs", "aws_s3", "gcp_s3")
valid_storage_remote(1, 3)
try(valid_storage_remote("I don't exist"))
valid_storage_local()
valid_storage_local("fs")
valid_storage_local(1)
try(valid_storage_local("I don't exist"))
valid_storage()
valid_storage("fs", "gcp_s3", "aws_s3")
valid_storage(2, 3, 1)
try(valid_storage("I don't exist"))

You can reverse the order or flip names and values

valid_devops_envs(reverse = TRUE)
valid_devops_envs(flip = TRUE) # doesn't really make sense in this case as both is lowercase
valid_devops_envs(unname = TRUE)

Custom function

Definition

You can build your functions on top of valid::valid()

my_valid_devops_envs <- function(
  x = character(),
  ...
) {
  choices <- c("dev", "staging", "prod")
  names(choices) <- toupper(choices)

  valid(
    choice = x,
    choices = choices,
    ...
  )
}

my_valid_devops_envs2 <- function(
  ...
) {
  choices <- c("dev", "staging", "prod")
  names(choices) <- toupper(choices)

  valid2(
    ...,
    .choices = choices
  )
}

Apply without explicit choice

my_valid_devops_envs()
my_valid_devops_envs(reverse = TRUE)
my_valid_devops_envs(flip = TRUE)
my_valid_devops_envs(unname = TRUE)
my_valid_devops_envs(flip = TRUE, unname = TRUE)

Choice via name

Valid:

my_valid_devops_envs("PROD")
my_valid_devops_envs(c("STAGING", "PROD"))
my_valid_devops_envs2("STAGING", "PROD")

Invalid:

try(my_valid_devops_envs("ABC"))
my_valid_devops_envs("ABC", strict = FALSE)

Partially invalid:

try(my_valid_devops_envs(x = c("DEV", "ABC")))
try(my_valid_devops_envs2("DEV", "ABC"))
my_valid_devops_envs(x = c("DEV", "ABC"), strict = FALSE)
my_valid_devops_envs2("DEV", "ABC", .strict = FALSE)

Choice via value

Valid:

my_valid_devops_envs("dev")
my_valid_devops_envs(c("dev", "staging"))
my_valid_devops_envs2("dev", "staging")

Invalid:

try(my_valid_devops_envs("abc"))
my_valid_devops_envs("abc", strict = FALSE)

Partially invalid

try(my_valid_devops_envs(c("dev", "abc")))
try(my_valid_devops_envs2("dev", "abc"))
my_valid_devops_envs(c("dev", "abc"), strict = FALSE)
my_valid_devops_envs2("dev", "abc", .strict = FALSE)

Choice via index/position

Valid:

my_valid_devops_envs(2)
my_valid_devops_envs(c(2, 3))
my_valid_devops_envs2(2, 3)

Invalid:

try(my_valid_devops_envs(4))
my_valid_devops_envs(4, strict = FALSE)

Partially invalid:

try(my_valid_devops_envs(x = c(1, 4)))
try(my_valid_devops_envs2(1, 4))
my_valid_devops_envs(x = c(1, 4), strict = FALSE)
my_valid_devops_envs2(1, 4, .strict = FALSE)

Use validation function inside of another function

foo <- function(
  devops_env = my_valid_devops_envs2("dev")
) {
  # Input validation
  devops_env <- match.arg(devops_env, my_valid_devops_envs2())

  # Body
  stringr::str_glue("DevOps env: {stringr::str_c(devops_env, collapse = ', ')}")
}

Keeping the default

foo()

Eager input validation

foo(
  devops_env = my_valid_devops_envs2("dev")
)
try(
  foo(
    devops_env = my_valid_devops_envs2("abc")
  )
)
try(
  foo(
    devops_env = my_valid_devops_envs2("dev", "abc")
  )
)

Lazy input validation

foo(
  devops_env = "dev"
)
try(
  foo(
    devops_env = "abc"
  )
)

Code of Conduct

Please note that the valid project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.



rappster/valid documentation built on Aug. 19, 2022, 1:59 p.m.