diff options
author | TinWoodman92 <chrhodgden@gmail.com> | 2023-07-07 19:25:39 -0500 |
---|---|---|
committer | TinWoodman92 <chrhodgden@gmail.com> | 2023-07-07 19:25:39 -0500 |
commit | f6bbfe5bcdbe2a29a8180e3d3fdaa55cddbc8f99 (patch) | |
tree | d6a3aa85c53397c7a801f6b37533d1382912406a /dialoguer/dialoguer.r | |
parent | 5753265e7ba136fdba10ca8ea384837a18179de6 (diff) |
Added save environment test.
Diffstat (limited to 'dialoguer/dialoguer.r')
-rw-r--r-- | dialoguer/dialoguer.r | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/dialoguer/dialoguer.r b/dialoguer/dialoguer.r new file mode 100644 index 0000000..32a0149 --- /dev/null +++ b/dialoguer/dialoguer.r @@ -0,0 +1,150 @@ +HEADER <- 2048 +PORT <- 6011 +SERVER <- "localhost" +FORMAT <- "utf-8" +DISCONNECT_MESSAGE <- "!DISSCONNECT" +UUID <- commandArgs(trailingOnly = TRUE)[1] +TARGET_FILE <- commandArgs(trailingOnly = TRUE)[2] + +data_type_vect <- c( + character = "character", + str = "character", + integer = "integer", + int = "integer", + double = "double", + float = "double", + logical = "logical", + bool = "logical" +) + +display_msg <- function(...) { + cat("\033[94m") + cat( + ..., + end = "\033[0m\n" + ) +} + +# may not need to pass connection if it will only be 1 per dialogue +send <- function(conn, data, send_data_type = FALSE) { + if (send_data_type) { + data_type_name <- typeof(data) + writeBin(data_type_name, conn) + recv_chk <- recv(conn, set_data_type = 'logical') + } + writeBin(data, conn) +} + +# may not need to pass connection if it will only be 1 per dialogue +# I still want to consolidate the recv_data_type and set_data_type args +recv <- function(conn, recv_data_type = FALSE, set_data_type = "character") { + if (recv_data_type) { + suppressWarnings(data_type <- readBin(conn, "raw", HEADER)) + while (length(data_type) == 0) { + suppressWarnings(data_type <- readBin(conn, "raw", HEADER)) + } + data_type <- readBin(data_type, "character") + data_type <- data_type_vect[data_type] + send(con, TRUE) + } else { + data_type <- set_data_type + } + + suppressWarnings(data <- readBin(conn, "raw", HEADER)) + while (length(data) == 0) { + suppressWarnings(data <- readBin(conn, "raw", HEADER)) + } + + data <- readBin(data, data_type) + + return(data) +} + +find_connection <- function() { + connected <- FALSE + while (!connected) { + con <- socketConnection( + host = SERVER, + port = PORT, + server = FALSE, + open = "a+b" + ) + + send(con, UUID) + uuid_chk <- recv(con) + connected <- (UUID == uuid_chk) + if (!connected) { + close(con) + } + } + return(con) +} + +import_variable <- function() { + var_name <- recv(con, FALSE, "character") + var_val <- get(var_name) + send(con, var_val, TRUE) +} + +assign_variable <- function() { + var_name <- recv(con, FALSE, "character") + send(con, TRUE) + var_val <- recv(con, TRUE) + send(con, TRUE) + assign(var_name, var_val, envir = globalenv()) +} + +evaluate_expression <- function() { + arg_count <- recv(con, FALSE, "integer") + send(con, TRUE) + kwarg_count <- recv(con, FALSE, "integer") + send(con, TRUE) + method_name <- recv(con, FALSE, "character") + send(con, TRUE) + args <- list() + if (arg_count > 0) { + for (i in 1:arg_count) { + args <- c(args, recv(con, TRUE)) + send(con, TRUE) + } + } + kwargs <- list() + if (kwarg_count > 0) { + keys <- c() + vals <- list() + for (i in 1:kwarg_count) { + keys <- c(keys, recv(con)) + send(con, TRUE) + vals <- c(vals, recv(con, TRUE)) + send(con, TRUE) + } + kwargs <- setNames(vals, keys) + } + args <- c(args, kwargs) + result <- do.call(method_name, args) + send(con, result, TRUE) +} + +con <- find_connection() + +#load target file +source(TARGET_FILE) + +send(con, TRUE) + +cmd_int <- -1 +while (cmd_int != 0) { + cmd_int <- recv(con, FALSE, "integer") + if (cmd_int == 1){ + send(con, TRUE) + import_variable() + } else if (cmd_int == 2) { + send(con, TRUE) + evaluate_expression() + } else if (cmd_int == 3) { + send(con, TRUE) + assign_variable() + } +} + +close(con)
\ No newline at end of file |