summaryrefslogtreecommitdiffstats
path: root/libimagruby/src/imag.rs
diff options
context:
space:
mode:
Diffstat (limited to 'libimagruby/src/imag.rs')
-rw-r--r--libimagruby/src/imag.rs148
1 files changed, 148 insertions, 0 deletions
diff --git a/libimagruby/src/imag.rs b/libimagruby/src/imag.rs
new file mode 100644
index 00000000..a59610b2
--- /dev/null
+++ b/libimagruby/src/imag.rs
@@ -0,0 +1,148 @@
+//
+// imag - the personal information management suite for the commandline
+// Copyright (C) 2015, 2016 Matthias Beyer <mail@beyermatthias.de> and contributors
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; version
+// 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+//
+
+
+use std::error::Error;
+
+use ruru::{Class, Boolean, RString, NilClass, VM, Object};
+
+use libimagrt::logger::ImagLogger;
+
+class!(RImag);
+
+methods!(
+ RImag,
+ itself,
+
+ fn r_initialize_logger(debug: Boolean, verbose: Boolean, colored: Boolean) -> NilClass {
+ use std::env::var as env_var;
+ use env_logger;
+ use log;
+ use log::{Log, LogLevel, LogRecord, LogMetadata};
+ use log::LogLevelFilter;
+
+ let debug = match debug {
+ Ok(d) => d.to_bool(),
+ Err(ref e) => {
+ VM::raise(e.to_exception(), e.description());
+ return NilClass::new();
+ },
+ };
+
+ let verbose = match verbose {
+ Ok(v) => v.to_bool(),
+ Err(ref e) => {
+ VM::raise(e.to_exception(), e.description());
+ return NilClass::new();
+ },
+ };
+
+ let colored = match colored {
+ Ok(c) => c.to_bool(),
+ Err(ref e) => {
+ VM::raise(e.to_exception(), e.description());
+ return NilClass::new();
+ },
+ };
+
+ if env_var("IMAG_LOG_ENV").is_ok() {
+ env_logger::init().unwrap();
+ } else {
+ let lvl = if debug {
+ LogLevelFilter::Debug
+ } else if verbose {
+ LogLevelFilter::Info
+ } else {
+ LogLevelFilter::Warn
+ };
+
+ log::set_logger(|max_log_lvl| {
+ max_log_lvl.set(lvl);
+ debug!("Init logger with {}", lvl);
+ let lgr = ImagLogger::new(lvl.to_log_level().unwrap())
+ .with_color(colored)
+ .with_prefix("[imag][ruby]".to_owned())
+ .with_dbg_file_and_line(false);
+ Box::new(lgr)
+ })
+ .map_err(|_| {
+ panic!("Could not setup logger");
+ })
+ .ok();
+ }
+
+ NilClass::new()
+ }
+
+ fn r_log_trace(l: RString) -> NilClass {
+ match l {
+ Err(ref e) => VM::raise(e.to_exception(), e.description()),
+ Ok(s) => trace!("{}", s.to_string()),
+ }
+ NilClass::new()
+ }
+
+ fn r_log_debug(l: RString) -> NilClass {
+ match l {
+ Err(ref e) => VM::raise(e.to_exception(), e.description()),
+ Ok(s) => debug!("{}", s.to_string()),
+ }
+ NilClass::new()
+ }
+
+ fn r_log_info(l: RString) -> NilClass {
+ match l {
+ Err(ref e) => VM::raise(e.to_exception(), e.description()),
+ Ok(s) => info!("{}", s.to_string()),
+ }
+ NilClass::new()
+ }
+
+ fn r_log_warn(l: RString) -> NilClass {
+ match l {
+ Err(ref e) => VM::raise(e.to_exception(), e.description()),
+ Ok(s) => warn!("{}", s.to_string()),
+ }
+ NilClass::new()
+ }
+
+ fn r_log_error(l: RString) -> NilClass {
+ match l {
+ Err(ref e) => VM::raise(e.to_exception(), e.description()),
+ Ok(s) => error!("{}", s.to_string()),
+ }
+ NilClass::new()
+ }
+
+);
+
+pub fn setup() -> Class {
+ let mut class = Class::new("RImag", None);
+ class.define(|itself| {
+ itself.def_self("init_logger", r_initialize_logger);
+ itself.def_self("trace", r_log_trace);
+ itself.def_self("dbg", r_log_debug);
+ itself.def_self("debug", r_log_debug);
+ itself.def_self("info", r_log_info);
+ itself.def_self("warn", r_log_warn);
+ itself.def_self("error", r_log_error);
+ });
+ class
+}
+