aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJokler <jokler.contact@gmail.com>2018-06-28 05:48:01 +0200
committerJokler <jokler.contact@gmail.com>2018-06-28 05:48:01 +0200
commit01735d63f2462162fccb914dffbbcd06244f85af (patch)
tree5ee4171a5e15c9d0f0ed32172c2e0cb747303202 /src
parentb3b53b4075ae626b16aa5e0c4781244c74e8dfb8 (diff)
downloadfrippy-01735d63f2462162fccb914dffbbcd06244f85af.tar.gz
frippy-01735d63f2462162fccb914dffbbcd06244f85af.zip
Factoids: Add a json.decode function to lua
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs1
-rw-r--r--src/plugins/factoids/mod.rs1
-rw-r--r--src/plugins/factoids/sandbox.lua1
-rw-r--r--src/plugins/factoids/utils.rs52
4 files changed, 48 insertions, 7 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 0a8af6e..9b49644 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -52,6 +52,7 @@ extern crate humantime;
extern crate irc;
extern crate regex;
extern crate reqwest;
+extern crate serde_json;
extern crate time;
pub mod error;
diff --git a/src/plugins/factoids/mod.rs b/src/plugins/factoids/mod.rs
index eb9c10d..6ff2132 100644
--- a/src/plugins/factoids/mod.rs
+++ b/src/plugins/factoids/mod.rs
@@ -208,6 +208,7 @@ impl<T: Database> Factoids<T> {
globals.set("factoid", code)?;
globals.set("download", lua.create_function(download)?)?;
+ globals.set("json_decode", lua.create_function(json_decode)?)?;
globals.set("sleep", lua.create_function(sleep)?)?;
globals.set("args", args)?;
globals.set("input", command.tokens.join(" "))?;
diff --git a/src/plugins/factoids/sandbox.lua b/src/plugins/factoids/sandbox.lua
index abc55ad..a927535 100644
--- a/src/plugins/factoids/sandbox.lua
+++ b/src/plugins/factoids/sandbox.lua
@@ -32,6 +32,7 @@ local sandbox_env = {
trim = trim,
eval = nil,
sleep = nil,
+ json = {decode = json_decode},
args = args,
input = input,
user = user,
diff --git a/src/plugins/factoids/utils.rs b/src/plugins/factoids/utils.rs
index 48ec385..c3bd629 100644
--- a/src/plugins/factoids/utils.rs
+++ b/src/plugins/factoids/utils.rs
@@ -1,15 +1,22 @@
-extern crate reqwest;
-
use std::thread;
use std::time::Duration;
+use serde_json::{self, Value as SerdeValue};
+
use super::rlua::Error as LuaError;
-use super::rlua::Lua;
+use super::rlua::Error::RuntimeError;
+use super::rlua::{Lua, Value as LuaValue};
+
use utils::error::ErrorKind::Connection;
use utils::Url;
use failure::Fail;
+pub fn sleep(_: &Lua, dur: u64) -> Result<(), LuaError> {
+ thread::sleep(Duration::from_millis(dur));
+ Ok(())
+}
+
pub fn download(_: &Lua, url: String) -> Result<String, LuaError> {
let url = Url::from(url).max_kib(1024);
match url.request() {
@@ -20,7 +27,7 @@ pub fn download(_: &Lua, url: String) -> Result<String, LuaError> {
_ => e.to_string(),
};
- Err(LuaError::RuntimeError(format!(
+ Err(RuntimeError(format!(
"Failed to download {} - {}",
url.as_str(),
error
@@ -29,7 +36,38 @@ pub fn download(_: &Lua, url: String) -> Result<String, LuaError> {
}
}
-pub fn sleep(_: &Lua, dur: u64) -> Result<(), LuaError> {
- thread::sleep(Duration::from_millis(dur));
- Ok(())
+fn convert_value(lua: &Lua, sval: SerdeValue) -> Result<LuaValue, LuaError> {
+ let lval = match sval {
+ SerdeValue::Null => LuaValue::Nil,
+ SerdeValue::Bool(b) => LuaValue::Boolean(b),
+ SerdeValue::String(s) => LuaValue::String(lua.create_string(&s)?),
+ SerdeValue::Number(n) => {
+ let f = n.as_f64().ok_or(RuntimeError(String::from("Failed to convert number into double",)))?;
+ LuaValue::Number(f)
+ }
+ SerdeValue::Array(arr) => {
+ let table = lua.create_table()?;
+ for (i, val) in arr.into_iter().enumerate() {
+ table.set(i + 1, convert_value(lua, val)?)?;
+ }
+
+ LuaValue::Table(table)
+ }
+ SerdeValue::Object(obj) => {
+ let table = lua.create_table()?;
+ for (key, val) in obj {
+ table.set(key, convert_value(lua, val)?)?;
+ }
+
+ LuaValue::Table(table)
+ }
+ };
+
+ Ok(lval)
+}
+
+pub fn json_decode(lua: &Lua, json: String) -> Result<LuaValue, LuaError> {
+ let ser_val: SerdeValue = serde_json::from_str(&json).map_err(|e| RuntimeError(e.to_string()))?;
+
+ convert_value(lua, ser_val)
}