ice framework documentation ice doc v1.10.1
Class Ice Cli

Console

    
namespace Ice\Cli;

use Ice\Di;
use Ice\Di\Access;

/**
 * This component allows to create CLI applications.
 *
 * @package     Ice/Cli
 * @category    Application
 * @author      Ice Team
 * @copyright   (c) 2014-2023 Ice Team
 * @license     http://iceframework.org/license
 */
class Console extends Access
{
    protected modules { get, set };

    const NORMAL = 0;
    const BOLD_BRIGHT = 1;
    const UNDERLINE = 4;
    const INVERSE = 7;

    const BLACK = 30;
    const RED = 31;
    const GREEN = 32;
    const YELLOW = 33;
    const BLUE = 34;
    const MAGENTA = 35;
    const CYAN = 36;
    const LIGHTGRAY = 37;
    const WHITE = 97;

    const BG_BLACK = 40;
    const BG_RED = 41;
    const BG_GREEN = 42;
    const BG_YELLOW = 43;
    const BG_BLUE = 44;
    const BG_MAGENTA = 45;
    const BG_CYAN = 46;
    const BG_LIGHTGRAY = 47;
    const BG_WHITE = 107;

    /**
     * Console constructor
     *
     * @param Di $di
     */
    public function __construct( di = null)
    {
        // Set the dependency injector
        let this->di = di;

        // Register the console itself as a service
        this->di->set("console", this);
    }

    /**
     * Add module with its dir path, initial class name and namespace
     *
     * @param string name
     * @param array options The keys can be [path|class|namespace]
     * @return object Console
     */
    public function addModule(string name, array options)
    {
        // add or replace module
        let this->modules[name] = options;

        return this;
    }

    /**
     * Handle an command-line request.
     *
     * @param array arguments
     * @return mixed
     */
    public function handle(arguments = null)
    {
        var router, response, dispatcher;

        let router = this->di->get("router"),
            response = router->handle(arguments),
            dispatcher = this->di->get("dispatcher");

        dispatcher->setModules(this->modules);
        dispatcher->setModule(response["module"]);
        dispatcher->setHandler(response["handler"]);
        dispatcher->setAction(response["action"]);
        dispatcher->setParams(response["params"]);

        let response = dispatcher->dispatch();

        return response;
    }

    /**
     * Returns the given text with the correct color codes for a foreground and optionally a background color.
     *
     * @param string text The text to color
     * @param int color The foreground color
     * @param int decoration Formatting type
     * @param int bgColor The background color
     * @return string Coded string
     */
    public function color(string text, int color = null, int decoration = 0, int bgColor = null)
    {
        var colored, e;

        boolean colors = globals_get("cli_colors");

        if colors {
            let e = "\e", // escape (hex 1B) chr(27)
                colored = e . "[" . decoration . (color ? ";" . color : "") . "m";

            if bgColor {
                let colored .= e . "[" . bgColor . "m";
            }

            return colored . text . e . "[0m";
        } else {
            return text;
        }
    }

    /**
     * Returns info text.
     *
     * @param string text
     * @return string
     */
    public function info(string text)
    {
        return this->color(text, self::CYAN);
    }

    /**
     * Returns success text.
     *
     * @param string text
     * @return string
     */
    public function success(string text)
    {
        return this->color(text, self::GREEN);
    }

    /**
     * Returns warning text.
     *
     * @param string text
     * @return string
     */
    public function warning(string text)
    {
        return this->color(text, self::YELLOW);
    }

    /**
     * Returns error text.
     *
     * @param string text
     * @return string
     */
    public function error(string text)
    {
        return this->color(text, self::RED);
    }
}