R/util_safely.R

Defines functions status_msg ternary allow_error error_msg failed succeeded error result is_safely_result empty_result

empty_result = function(res) {
  if (is_safely_result(res)){
    empty_result(result(res))
  } else {
    length(res) == 1 & all(res == "")
  }
}


is_safely_result = function(res) {
  if (!is.list(res))
    return(FALSE)

  if (!all(c("result", "error") %in% names(res)))
    return(FALSE)

  TRUE
}

result = function(x) {
  stopifnot("result" %in% names(x))
  x[["result"]]
}

error = function(x) {
  stopifnot("error" %in% names(x))
  x[["error"]]
}

succeeded = function(x) {
  !is.null(result(x))
}

failed = function(x) {
  !is.null(error(x))
}

error_msg = function(x) {
  error(x)[["message"]]
}


allow_error = function(res, message = NULL, class = NULL, result = "") {

  stopifnot(!is.null(message) | !is.null(class))

  if (succeeded(res))
    return(res)

  message_flag = TRUE
  if (!is.null(message)) {
    message_flag = grepl(message, error_msg(res))
  }

  class_flag = TRUE
  if (!is.null(class)) {
    class_flag = inherits(error(res), class)
  }

  if (message_flag & class_flag) {
    list(
      result = result,
      error = NULL
    )
  } else {
    res
  }
}

ternary = function(check, success, fail) {
  if (check)
    success
  else
    fail
}


status_msg = function(x, success, fail, include_error_msg = TRUE) {
  if (succeeded(x) & !missing(success)) {
    usethis::ui_done(success)
  }

  if (failed(x) & !missing(fail)) {
    if (include_error_msg) {
      fail = c(fail, crayon::blurred("{error_msg(x)}"))
    }
    usethis::ui_oops(fail)
  }
}
rundel/livecode documentation built on Sept. 10, 2020, 9:19 p.m.