## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

# Setting up a tmp folder to use as the working directory for
# the vignette. Also create a folder used in examples below.

tmp <- withr::local_tempdir()
dir.create(path = file.path(tmp, "my_root_path", "my_project"), recursive = TRUE)

library(connector)

## -----------------------------------------------------------------------------
connector_myclass <- R6::R6Class(
  "connector_myclass",
  inherit = Connector
)

connector_myclass$new()

## -----------------------------------------------------------------------------
connector_project <- R6::R6Class(
  "connector_project",
  inherit = ConnectorFS,
  public = list(
    initialize = function(project) {
      private$.project <- project
      path <- file.path(tmp, "my_root_path", project)
      super$initialize(path)
    }
  ),
  private = list(
    .project = NULL
  ),
  active = list(
    project = function() {
      private$.project
    }
  )
)

## -----------------------------------------------------------------------------
my_project <- connector_project$new(project = "my_project")

print(my_project)

## -----------------------------------------------------------------------------
# First list current content:
my_project |>
  list_content_cnt()

# Write some content:
my_project |>
  write_cnt("Hello world!", "my_file.txt")

# List content again:
my_project |>
  list_content_cnt()

# Read the content:
my_project |>
  read_cnt("my_file.txt")

## -----------------------------------------------------------------------------
# Print the generic
print(list_content_cnt)

# List the registered s3 methods
methods("list_content_cnt") |>
  cat(sep = "\n")

## -----------------------------------------------------------------------------
list_content_cnt.connector_project <- function(connector_object, ...) {
  cli::cli_alert("Listing content of {connector_object$project}")
  NextMethod()
}

## -----------------------------------------------------------------------------
# List methods again
methods("list_content_cnt") |>
  cat(sep = "\n")

# Print my_project connector to see associated methods
print(my_project)

## -----------------------------------------------------------------------------
my_project |>
  list_content_cnt()

## -----------------------------------------------------------------------------
my_project_extra <- ConnectorFS$new(
  path = file.path(tmp, "my_root_path", "my_project"),
  extra_class = "my_extra_class"
)

print(my_project_extra)

## -----------------------------------------------------------------------------
list_content_cnt.my_extra_class <- function(connector_object, ...) {
  cli::cli_alert("Listing content of {connector_object$path}")
  NextMethod()
}

## -----------------------------------------------------------------------------
# List methods
methods("list_content_cnt")

# Print my_project_extra connector to see associated methods
print(my_project_extra)

# List content to see the new message
my_project_extra |>
  list_content_cnt()

## -----------------------------------------------------------------------------
read_ext.myformat <- function(path, ...) {
  cli::cli_alert("Reading myformat file")
  readLines(con = path)
}

write_ext.myformat <- function(file, x, ...) {
  cli::cli_alert("Writing myformat file")
  writeLines(text = x, con = file)
}

## -----------------------------------------------------------------------------
# List already existing content:
my_project |>
  list_content_cnt()

# Write some content in myformat:
my_project |>
  write_cnt("Hello new format!", "new_file.myformat")

# List content again:
my_project |>
  list_content_cnt()

# Read the content:
my_project |>
  read_cnt("new_file.myformat")