use super::lua_state_wrapper::LuaStateWrapper;
pub struct ConstantStrings;
impl ConstantStrings {
pub const OK: &[u8] = b"OK";
pub const OK_LOWER: &[u8] = b"ok";
pub const ERR: &[u8] = b"err";
pub const NO_SESSION_AVAILABLE: &[u8] = b"No session available";
pub const PLEASE_SPECIFY_REDIS_CALL: &[u8] =
b"ERR Please specify at least one argument for this redis lib call";
pub const ERR_NO_PERM: &[u8] = b"NOPERM this user has no permissions to run the command";
pub const ERR_UNKNOWN: &[u8] = b"ERR Unknown Redis command called from script";
pub const RESP_ERR_GENERIC_UNK_CMD: &[u8] = b"ERR unknown command";
pub const ERR_BAD_ARG: &[u8] = b"ERR Lua redis lib command arguments must be strings or integers";
pub const ERR_WRONG_NUMBER_OF_ARGS: &[u8] = b"ERR wrong number of arguments";
pub const ERR_REDIS_LOG_REQUIRED: &[u8] = b"ERR redis.log() requires two arguments or more.";
pub const ERR_FIRST_ARG_MUST_BE_NUMBER: &[u8] =
b"ERR First argument must be a number (log level).";
pub const ERR_INVALID_DEBUG_LEVEL: &[u8] = b"ERR Invalid debug level.";
pub const ERR_INVALID_COMMAND: &[u8] = b"ERR Invalid command passed to redis.acl_check_cmd()";
pub const ERR_REDIS_SETRESP_ARG: &[u8] = b"ERR redis.setresp() requires one argument.";
pub const ERR_RESP_VERSION: &[u8] = b"ERR RESP version must be 2 or 3.";
pub const ERR_LOGGING_DISABLED: &[u8] = b"ERR redis.log(...) disabled in Garnet config";
pub const DOUBLE: &[u8] = b"double";
pub const MAP: &[u8] = b"map";
pub const SET: &[u8] = b"set";
pub const BIG_NUMBER: &[u8] = b"big_number";
pub const FORMAT: &[u8] = b"format";
pub const STRING: &[u8] = b"string";
pub const BAD_ARG_ATAN2: &[u8] = b"bad argument to atan2";
pub const BAD_ARG_COSH: &[u8] = b"bad argument to cosh";
pub const BAD_ARG_FREXP: &[u8] = b"bad argument to frexp";
pub const BAD_ARG_LDEXP: &[u8] = b"bad argument to ldexp";
pub const BAD_ARG_LOG10: &[u8] = b"bad argument to log10";
pub const BAD_ARG_POW: &[u8] = b"bad argument to pow";
pub const BAD_ARG_SINH: &[u8] = b"bad argument to sinh";
pub const BAD_ARG_TANH: &[u8] = b"bad argument to tanh";
pub const BAD_ARG_MAXN: &[u8] = b"bad argument to maxn";
pub const BAD_ARG_LOAD_STRING: &[u8] = b"bad argument to loadstring";
pub const BAD_ARG_LOAD_STRING_NULL_BYTE: &[u8] =
b"bad argument to loadstring, interior null byte";
pub const BAD_ARG_TO_BIT: &[u8] = b"bad argument to tobit";
pub const BAD_ARG_TO_HEX: &[u8] = b"bad argument to tohex";
pub const BAD_ARG_BSWAP: &[u8] = b"bad argument to bswap";
pub const BAD_ARG_BNOT: &[u8] = b"bad argument to bnot";
pub const BAD_ARG_ENCODE: &[u8] = b"bad argument to encode";
pub const BAD_ARG_DECODE: &[u8] = b"bad argument to decode";
pub const BAD_ARG_PACK: &[u8] = b"bad argument to pack";
pub const BAD_ARG_UNPACK: &[u8] = b"bad argument to unpack";
pub const BAD_ARG_FORMAT: &[u8] = b"bad argument to format";
pub const BAD_ARG_BOR: &[u8] = b"bad argument to bor";
pub const BAD_ARG_BAND: &[u8] = b"bad argument to band";
pub const BAD_ARG_BXOR: &[u8] = b"bad argument to bxor";
pub const BAD_ARG_LSHIFT: &[u8] = b"bad argument to lshift";
pub const BAD_ARG_RSHIFT: &[u8] = b"bad argument to rshift";
pub const BAD_ARG_ARSHIFT: &[u8] = b"bad argument to arshift";
pub const BAD_ARG_ROL: &[u8] = b"bad argument to rol";
pub const BAD_ARG_ROR: &[u8] = b"bad argument to ror";
pub const UNEXPECTED_JSON_VALUE_KIND: &[u8] = b"Unexpected json value kind";
pub const CANNOT_SERIALISE_TO_JSON: &[u8] = b"Cannot serialise Lua type to JSON";
pub const UNEXPECTED_ERROR: &[u8] = b"Unexpected Lua error";
pub const CANNOT_SERIALISE_NESTING: &[u8] = b"Cannot serialise, excessive nesting (1001)";
pub const UNABLE_TO_FORMAT_NUMBER: &[u8] = b"Unable to format number";
pub const FOUND_TOO_MANY_NESTED: &[u8] = b"Found too many nested data structures (1001)";
pub const EXPECTED_VALUE_BUT_FOUND: &[u8] = b"Expected value but found invalid token.";
pub const MISSING_BYTES_IN_INPUT: &[u8] = b"Missing bytes in input.";
pub const UNEXPECTED_MSGPACK_SIGIL: &[u8] = b"Unexpected MsgPack sigil";
pub const MSGPACK_STRING_TOO_LONG: &[u8] = b"MsgPack string is too long";
pub const MSGPACK_ARRAY_TOO_LONG: &[u8] = b"MsgPack array is too long";
pub const MSGPACK_MAP_TOO_LONG: &[u8] = b"MsgPack map is too long";
pub const INSUFFICIENT_LUA_STACK_SPACE: &[u8] = b"Insufficient Lua stack space";
pub const PARAMETER_RESET_FAILED_MEMORY: &[u8] =
b"Resetting parameters to Lua script failed: Memory";
pub const PARAMETER_RESET_FAILED_SYNTAX: &[u8] =
b"Resetting parameters to Lua script failed: Syntax";
pub const PARAMETER_RESET_FAILED_RUNTIME: &[u8] =
b"Resetting parameters to Lua script failed: Runtime";
pub const PARAMETER_RESET_FAILED_OTHER: &[u8] =
b"Resetting parameters to Lua script failed: Other";
pub const OUT_OF_MEMORY: &[u8] = b"Lua VM ran out of memory";
pub const ERR_UNKNOWN_TEXT: &[u8] = b"ERR unknown command";
pub const LOAD_STRING_ERROR: &[u8] = b"load_string encountered error";
pub const AND: &[u8] = b"AND";
pub const OR: &[u8] = b"OR";
pub const XOR: &[u8] = b"XOR";
pub const NOT: &[u8] = b"NOT";
pub const DIFF: &[u8] = b"DIFF";
pub const KEYS: &[u8] = b"KEYS";
pub const ARGV: &[u8] = b"ARGV";
}
pub struct LuaRunner_Strings;
impl LuaRunner_Strings {
pub fn constant_string_to_registry(state: &mut LuaStateWrapper, string: &[u8]) -> i32 {
if !state.try_push_buffer(string) {
panic!("Insufficient space in Lua VM for constant string");
}
state
.try_ref()
.expect("Insufficient space in Lua VM for constant string")
}
}
#[cfg(test)]
mod tests {
use super::{ConstantStrings, LuaRunner_Strings};
use crate::lua::lua_state_wrapper::LuaStateWrapper;
#[test]
fn constant_string_texts_match_cmd_strings() {
assert_eq!(ConstantStrings::OK_LOWER, b"ok");
assert_eq!(
ConstantStrings::ERR_UNKNOWN,
b"ERR Unknown Redis command called from script"
);
assert_eq!(
ConstantStrings::CANNOT_SERIALISE_NESTING,
b"Cannot serialise, excessive nesting (1001)"
);
assert_eq!(ConstantStrings::KEYS, b"KEYS");
assert_eq!(ConstantStrings::ARGV, b"ARGV");
}
#[test]
fn constant_string_to_registry_roundtrip() {
let mut state = LuaStateWrapper::new();
let id = LuaRunner_Strings::constant_string_to_registry(&mut state, ConstantStrings::OK_LOWER);
assert!(state.expect_lua_stack_empty());
assert!(state.push_ref(id));
assert_eq!(state.known_string_to_buffer(-1).unwrap(), b"ok");
}
}