knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/README-", out.width = "100%" )
# install.packages("remotes") remotes::install_github("rappster/valid")
Helpers for facilitating systematic input validation
Input validation is tedious already. This package hopefully provides some functionality to make the task a bit easier or at least more fun.
library(valid)
The actual workhorse is valid()
while valid2()
makes choice input a bit more
convenient via the ...
mechanism.
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()
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)
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 ) }
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)
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)
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)
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)
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 = ', ')}") }
foo()
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") ) )
foo( devops_env = "dev" )
try( foo( devops_env = "abc" ) )
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.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.