view libirccd-js/irccd/js/logger_js_api.cpp @ 773:8c44bbcbbab9

Misc: style, cleanup and update
author David Demelier <markand@malikania.fr>
date Fri, 26 Oct 2018 13:01:00 +0200
parents 445c071e8efb
children 8460b4a34191
line wrap: on
line source

/*
 * logger_js_api.cpp -- Irccd.Logger API
 *
 * Copyright (c) 2013-2018 David Demelier <markand@malikania.fr>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <irccd/daemon/irccd.hpp>
#include <irccd/daemon/logger.hpp>
#include <irccd/daemon/plugin_service.hpp>

#include "irccd_js_api.hpp"
#include "js_plugin.hpp"
#include "logger_js_api.hpp"
#include "plugin_js_api.hpp"

namespace irccd::js {

namespace {

// {{{ print

auto print(duk_context* ctx, unsigned level) -> duk_ret_t
{
	assert(level <= 2);

	try {
		auto& sink = duk::type_traits<irccd>::self(ctx).get_log();
		auto& self = duk::type_traits<js_plugin>::self(ctx);

		switch (level) {
		case 0:
			sink.debug<plugin>(self) << duk_require_string(ctx, 0) << std::endl;
			break;
		case 1:
			sink.info<plugin>(self) << duk_require_string(ctx, 0) << std::endl;
			break;
		default:
			sink.warning<plugin>(self) << duk_require_string(ctx, 0) << std::endl;
			break;
		}
	} catch (const std::exception& ex) {
		duk::raise(ctx, ex);
	}

	return 0;
}

// }}}

// {{{ Irccd.Logger.info

/*
 * Function: Irccd.Logger.info(message)
 * --------------------------------------------------------
 *
 * Write a verbose message.
 *
 * Arguments:
 *   - message, the message.
 * Throws:
 *   - Irccd.SystemError on errors
 */
auto Logger_info(duk_context* ctx) -> duk_ret_t
{
	return print(ctx, 1);
}

// }}}

// {{{ Irccd.Logger.warning

/*
 * Function: Irccd.Logger.warning(message)
 * --------------------------------------------------------
 *
 * Write a warning message.
 *
 * Arguments:
 *   - message, the warning.
 * Throws:
 *   - Irccd.SystemError on errors
 */
auto Logger_warning(duk_context* ctx) -> duk_ret_t
{
	return print(ctx, 2);
}

// }}}

// {{{ Irccd.Logger.debug

/*
 * Function: Irccd.Logger.debug(message)
 * --------------------------------------------------------
 *
 * Write a debug message, only shown if irccd is compiled in debug.
 *
 * Arguments:
 *   - message, the message.
 * Throws:
 *   - Irccd.SystemError on errors
 */
auto Logger_debug(duk_context* ctx) -> duk_ret_t
{
	return print(ctx, 0);
}

// }}}

const duk_function_list_entry functions[] = {
	{ "info",       Logger_info,    1 },
	{ "warning",    Logger_warning, 1 },
	{ "debug",      Logger_debug,   1 },
	{ nullptr,      nullptr,        0 }
};

} // !namespace

auto logger_js_api::get_name() const noexcept -> std::string_view
{
	return "Irccd.Logger";
}

void logger_js_api::load(irccd&, std::shared_ptr<js_plugin> plugin)
{
	duk::stack_guard sa(plugin->get_context());

	duk_get_global_string(plugin->get_context(), "Irccd");
	duk_push_object(plugin->get_context());
	duk_put_function_list(plugin->get_context(), -1, functions);
	duk_put_prop_string(plugin->get_context(), -2, "Logger");
	duk_pop(plugin->get_context());
}

} // !irccd::js