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

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

# 1:  Safely set autos

If you would like to account for potential syntax errors when sourcing in your `autos`, you can wrap `rprofile()` in `purrr::safely()`. This function will attempt to set the autos and return a list containing the result and any error that occurred.

Let's show an example.  First we'll make an example configuration file that will automatically source your autos.  We'll intentionally add a syntax error to show how `safely()` works.

Here is our configuration file, which will automatically source the autos from the `DEV` and `PROD` directories:

```{r eval = FALSE}
default:
  autos:
    projects: !expr list(
      "DEV" = file.path("demo", "DEV", "username", "project1", "functions"),
      "PROD" = file.path("demo", "PROD", "project1", "functions")
      )
```

We will do a little work here to create the directory, place a script into the directory.  We'll add a syntax error by leaving off a closing `}` in `test_error.R` script in the PROD folder.


```{r}
# create the temp directory
dir <- fs::file_temp()
dir.create(dir)
dir.create(file.path(dir, "/demo/PROD/project1/functions"), recursive = TRUE)

# write a function to the folder with an error
file_conn <- file(file.path(dir, "/demo/PROD/project1/functions/test_error.R"))
writeLines(
"test <- function(){print('test')", file_conn)
close(file_conn)

# write the config
config_path <- file.path(dir, "_envsetup.yml")
file_conn <- file(config_path)
writeLines(
  paste0(
"default:
  autos:
    PROD: '", dir,"/demo/PROD/project1/functions'"
  ), file_conn)
close(file_conn)
```

So if we call `rprofile()` passing in this config file, we will get an error because of the syntax error in `test_error.R`:

```{r error = TRUE}
library(envsetup)

envsetup_config <- config::get(file = config_path)

rprofile(envsetup_config)
```

To handle this error, we can use `purrr::safely()` to wrap the `rprofile()` function. This will allow us to catch the error and handle it gracefully.

```{r setup}
safely_rprofile <- purrr::safely(rprofile)

ret <- safely_rprofile(envsetup_config)
```

We still have an error, but safely allow the setup to continue.  We can check the result of the `safely_rprofile()` function to see if there was an error, identify the issue and correct the syntax error in the function.

```{r check}
# check for errors and return if any occurred
if(!is.null(ret$error)) {
  print(ret$error)
}
```

```{r echo = FALSE}
unlink(dir, recursive=TRUE)
```
