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

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

We can easily set global path validation using `on_path_not_exists` and `on_validate_path` functions.

```{r options.backup}
old.options <- options()
```

## path.chain + logger: handling errors
```{r setup}
library(path.chain)
library(logger)

log_level(ERROR)
log_appender(appender_console)
on_path_not_exists(~ log_error("Path {.x} not exists"))

level2.b <- path_link("fileA.RData")
level2.a <- path_link("fileB.fst")
level1   <- path_link("data", list(level2.a = level2.a , level2.b = level2.b))
root     <- path_link("files", list(level1))
root$data$level2.a

on_path_not_exists(NULL)

root$data$level2.a

```

## Check path correctness

In some cases, path may even exists, being in the same time unsuitable for our purposes. 
`on_validate_path` function was created exactly to handle such cases.

```{r validate.path}
is_path_valid <- function(x) if (!grepl("\\.fst", x)) print("Invalid file")
on_validate_path(is_path_valid)

root$data$level2.a
root$data$level2.b
```

```{r clean}
options(old.options)
```