R/person.R

Defines functions person

Documented in person

#' Update a person file.
#' @description
#' This function creates, prints, extends, deletes, or modifies the file for
#' person \code{name}.
#' @details
#' Internally, \code{name} is transformed to a string which can be properly
#' saved by \link{transform_name}. The file for \code{name} is
#' \itemize{
#'   \item created, if \code{name} does not exist,
#'   \item printed, if \code{name} does exist,
#'   \item extended by \code{note}, if \code{note} is specified,
#'   \item deleted, if \code{delete = "all"},
#'   \item modified (i.e. the notes with the numbers specified in \code{delete})
#'   get deleted, if \code{delete} is a vector of numbers.
#' }
#' Set \code{name = "all"} to print all saved person files.
#' @param name
#' The person's name.
#' @param note
#' A note for person \code{name}.
#' @param delete
#' A number or a vector of numbers, which correspond to the notes that get
#' deleted. If \code{delete = "all"}, the whole person file gets deleted.
#' @inheritParams folder
#' @return
#' Returns invisibly the updated folder (which is an object of class
#' \code{personfiles}). The folder also is saved in \code{folder_dir}.
#' @examples
#' ### Create encrypted folder.
#' folder_dir <- tempdir()
#' folder(password = "secret", folder_dir = folder_dir, overwrite = TRUE)
#' ### Create person file for John Doe.
#' person(name = "John Doe", note = "Likes chess.", password = "secret",
#'        folder_dir = folder_dir)
#' ### Add another note for John Doe.
#' person(name = "John Doe", note = "Always plays 1.e4.", password = "secret",
#'        folder_dir = folder_dir)
#' ### Print person file for John Doe.
#' person(name = "John Doe", password = "secret", folder_dir = folder_dir)
#' ### Create person file for Jane Doe.
#' person(name = "Jane Doe", note = "Married to John Doe.",
#'        password = "secret", folder_dir = folder_dir)
#' ### Print all person files.
#' person(name = "all", password = "secret", folder_dir = folder_dir)
#' ### Delete note 'Always plays 1.e4.' of John Doe.
#' person(name = "John Doe", delete = 2, password = "secret",
#'        folder_dir = folder_dir)
#' ### Delete file of Jane Doe.
#' person(name = "Jane Doe", delete = "all", password = "secret",
#'        folder_dir = folder_dir)
#' @export

person <- function(name = "all", note = NULL, delete = NULL, password = NULL,
                   folder_dir = ".") {
  if(!is.null(delete) && delete != "all" &&
     !(is.numeric(delete) && delete%%1==0 && delete>0))
    stop("'delete' must be NULL, 'all', a number, or a vector of numbers.")
  path <- personfiles_path(folder_dir = folder_dir)
  if(file.exists(path)){
    folder_encrypted <- readRDS(path)
  } else {
    stop("Could not open ",path,".")
  }
  folder_decrypted <- folder_decrypt(folder_encrypted = folder_encrypted,
                                     password = password)
  if(name == "all"){
    print.personfiles(folder_decrypted, name = "all")
  } else {
    tname <- transform_name(name)
    if(!tname %in% names(folder_decrypted)){
      folder_decrypted[[tname]] <- list()
      cat("Created file for",paste0(name,"."),"\n")
    }
    if(!is.null(note)){
      note <- paste(as.character(note), collapse = "; ")
      index <- length(folder_decrypted[[tname]])+1
      folder_decrypted[[tname]][[index]] <- list("date" = Sys.Date(),
                                                 "note" = note)
      cat("Added note for",paste0(name,"."),"\n")
    }
    if(!is.null(delete)){
      if(delete == "all"){
        folder_decrypted[[tname]] <- NULL
        cat("Deleted file for",paste0(name,"."),"\n")
      } else {
        for(i in delete) folder_decrypted[[tname]][[i]] <- NULL
        cat("Deleted note(s) for",paste0(name,"."),"\n")
      }
    }
    print.personfiles(folder_decrypted, name = name)
  }
  folder_encrypted <- folder_encrypt(folder_decrypted = folder_decrypted,
                                     password = password)
  saveRDS(folder_encrypted, path)
  return(invisible(folder_encrypted))
}
loelschlaeger/personfiles documentation built on Dec. 21, 2021, 11:45 a.m.