---
title: "checkCLI usage"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{usage}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
library(checkmate)
library(checkCLI)
```

---

## Quick Start

### Basic Usage

Compare standard checkmate assertions with checkCLI:

**Standard checkmate:**
```{r, error=TRUE}
assert_int(3.14)
```

**With checkCLI:**
```{r, error=TRUE}
assert_int_cli(3.14)
```

### Function Categories

The package provides CLI-enhanced versions of checkmate functions organized into categories:

#### Scalars / Atomic Types
- `check_atomic_cli()` / `assert_atomic_cli()`
- `check_atomic_vector_cli()` / `assert_atomic_vector_cli()`
- `check_scalar_cli()` / `assert_scalar_cli()`
- `check_scalar_na_cli()` / `assert_scalar_na_cli()`
- `check_integer_cli()` / `assert_integer_cli()`
- `check_integerish_cli()` / `assert_integerish_cli()`
- `check_double_cli()` / `assert_double_cli()`
- `check_complex_cli()` / `assert_complex_cli()`
- `check_count_cli()` / `assert_count_cli()`
- `check_string_cli()` / `assert_string_cli()`
- `check_flag_cli()` / `assert_flag_cli()`
- `check_int_cli()` / `assert_int_cli()`
- `check_numeric_cli()` / `assert_numeric_cli()`
- `check_number_cli()` / `assert_number_cli()`
- `check_logical_cli()` / `assert_logical_cli()`
- `check_character_cli()` / `assert_character_cli()`
- `check_null_cli()` / `assert_null_cli()`
- `check_true_cli()` / `assert_true_cli()`
- `check_false_cli()` / `assert_false_cli()`

#### Containers / Data Structures
- `check_array_cli()` / `assert_array_cli()`
- `check_matrix_cli()` / `assert_matrix_cli()`
- `check_vector_cli()` / `assert_vector_cli()`
- `check_list_cli()` / `assert_list_cli()`
- `check_data_frame_cli()` / `assert_data_frame_cli()`
- `check_factor_cli()` / `assert_factor_cli()`
- `check_environment_cli()` / `assert_environment_cli()`
- `check_function_cli()` / `assert_function_cli()`
- `check_formula_cli()` / `assert_formula_cli()`
- `check_r6_cli()` / `assert_r6_cli()`
- `check_raw_cli()` / `assert_raw_cli()`

#### Names and Sets
- `check_names_cli()` / `assert_names_cli()`
- `check_subset_cli()` / `assert_subset_cli()`
- `check_permutation_cli()` / `assert_permutation_cli()`
- `check_choice_cli()` / `assert_choice_cli()`
- `check_set_equal_cli()` / `assert_set_equal_cli()`
- `check_disjunct_cli()` / `assert_disjunct_cli()`
- `check_class_cli()` / `assert_class_cli()`
- `check_multi_class_cli()` / `assert_multi_class_cli()`

#### Files, Directories, and Paths
- `check_file_cli()` / `assert_file_cli()`
- `check_file_exists_cli()` / `assert_file_exists_cli()`
- `check_directory_cli()` / `assert_directory_cli()`
- `check_directory_exists_cli()` / `assert_directory_exists_cli()`
- `check_path_for_output_cli()` / `assert_path_for_output_cli()`

#### Date/Time and Special Classes
- `check_date_cli()` / `assert_date_cli()`
- `check_posixct_cli()` / `assert_posixct_cli()`
- `check_os_cli()` / `assert_os_cli()`


#### Combination Assertions
- `assert_cli()` - Combine multiple assertions with "or" or "and" logic

---

## Usage Examples

### Basic Assertion with Immediate Error

```{r, error=TRUE}
# This will produce a formatted error message
assert_numeric_cli(c("a", "b"))
```

### Using `add` Parameter for Error Collection

Collect multiple validation errors without stopping execution:

```{r, error=TRUE}
# Create an assertion collection
add <- AssertCollection$new()

# Run multiple assertions
assert_numeric_cli(c("a", "b"), add = add)
assert_int_cli(3.14, add = add)
assert_file_exists_cli("nonexistent.txt", add = add)

# Report all errors at once
if (!add$isEmpty()) {
  add$report()
}
```

### Combining Multiple Assertions

```{r, error=TRUE}
# Assert that at least one condition is true ("or")
assert_cli(
  check_numeric_cli(x),
  check_integer_cli(x),
  combine = "or"
)

# Assert that all conditions are true ("and")
assert_cli(
  check_numeric_cli(x),
  check_vector_cli(x),
  combine = "and"
)
```

### Custom Variable Names

```{r, error=TRUE}
# Specify a custom variable name in error messages
my_data <- "invalid"
assert_numeric_cli(my_data, .var.name = "my_data")
```

---

## Design Philosophy

`checkCLI` follows these principles:

1. **Transparency:** All error messages are clear and actionable
2. **Consistency:** Uses the same patterns across all validation functions
3. **Flexibility:** Supports both fail-fast and error collection workflows
4. **Integration:** Works seamlessly as a drop-in replacement for checkmate assertions
5. **Aesthetics:** Leverages modern CLI formatting for professional output

---

## Comparison: checkmate vs checkCLI

| Aspect | checkmate | checkCLI |
|--------|-----------|----------|
| Error Messages | Plain text | Formatted with colors and bullets |
| Visual Clarity | Minimal | Enhanced with symbols (✖, ℹ) |
| Error Collection | Supported | Supported with better formatting |
| Integration | Direct | Wrapper functions with `_cli` suffix |
| Dependencies | Core validation logic | Extended with cli, glue, purrr |
| Learning Curve | Standard R | Minimal (identical API) |

---

## Error Message Examples

### Type Validation Error
```
✖ Assertion on x failed.
ℹ Variable 'x' is not of type 'integer'
```

### Multiple Validation Errors (Collected)
```
✖ Assertion on data failed.
ℹ (i): not numeric
ℹ (j): not integer
```

### File Validation Error
```
✖ Assertion on filepath failed.
ℹ File '/path/to/missing.txt' does not exist
```

---

## Best Practices

1. **Use `_cli` suffix versions** for user-facing functions and packages
2. **Collect errors in production code** using the `add` parameter for batch validation
3. **Provide custom variable names** with `.var.name` for clarity in error messages
4. **Use `assert_cli()` with combine parameter** for flexible multi-condition validation
5. **Check your R environment colors** - the package respects system color capabilities
