Игра с функцией add_main_option

В этом посте я рассмотрю возможности, предлагаемые методом add_main_option Gio.Application. Сначала давайте посмотрим на аргументы метода:

Gio.Application.add_main_option(long_name,
                                short_name,
                                flags,
                                arg,
                                description,
                                arg_description)
      long_name   the long name of an option used to specify it
                  in a commandline
     short_name   the short name of an option
          flags   flags from GLib.OptionFlags
            arg   the type of the option, as a GLib.OptionArg
    description   the description for the option in --help output
arg_description   the placeholder to use for the extra argument
                  parsed by the option in --help output

long_name, short_name и description говорят сами за себя, но как насчет флагов, arg и arg_description? Давайте изучим их.

GLib.OptionFlags

Установка этого флага добавляет дополнительное поведение к опции (вы можете увидеть все значения здесь), поэтому давайте посмотрим на одно: GLib.OptionFlags.HIDDEN

Если для этого флага установлено значение GLib.OptionFlags.HIDDEN, аргумент не появится в выводе --help, но его можно будет использовать. Например, если у вас есть один параметр, определенный, как показано ниже:

this.add_main_option(‘One’,
                     ‘1’.charCodeAt(0),
                     GLib.OptionFlags.HIDDEN,
                     GLib.OptionArg.NONE,
                     “One”,
                     null);

Затем в консоли:

$ ./handling4.js --help
Usage:
 gjs [OPTION…]
Help Options:
 -h, --help               Show help options
 --help-all               Show all help options
 --help-gapplication      Show GApplication options
Application Options:
 -v, --version            Shows program version
 -2, --Two                Two
$ ./handling4.js -1
One was specified

Как видите, первый вариант не отображается в выводе --help, но его можно использовать.

GLib.OptionArg

Это довольно интересно и позволяет нам определить дополнительные аргументы для опции, например: --user=USER. GLib.OptionArg ‘enum’ определяет тип данных аргумента, который будет передан опции (все их можно посмотреть здесь). Давайте посмотрим полный пример:

#!/usr/bin/gjs
// handling5.js
const System        = imports.system;
const Gio           = imports.gi.Gio;
const GLib          = imports.gi.GLib;
const Lang          = imports.lang;
const Handling = new Lang.Class({
    Name: 'Handling',
    Extends: Gio.Application,
    _version: '0.1',
    _init: function() {
        this.parent({ application_id: 'handling.example.com',
                      flags: Gio.ApplicationFlags.HANDLES_OPEN });
        this.add_main_option('version',
                             'v'.charCodeAt(0),
                             GLib.OptionFlags.NONE,
                             GLib.OptionArg.NONE,
                             "Shows program version",
                             null);
        this.add_main_option('user',
                             'U'.charCodeAt(0),
                             GLib.OptionFlags.NONE,
                             GLib.OptionArg.STRING,
                             "User Name",
                             "USER");
        GLib.set_application_name("Handling");
    },
    vfunc_activate: function() {
        this.parent();
    },
    
    vfunc_startup: function() {
        this.parent();
    },
    vfunc_handle_local_options: function(options) {
        if (options.contains('version')) {
            print(this._version);
            return 0;
        }
        if (options.contains('user')) {
            print('Value of user: ' + 
               options.lookup_value('user', null).get_string()[0]);
        }
        return -1;
    },
    
    vfunc_open: function(files, hint) {
        files.forEach(
            Lang.bind(this,
                      function(element, index, array) {
                        print (element.get_uri())
                      }));
    },
    vfunc_shutdown: function() {
        this.parent();
    }
});
(new Handling()).run([System.programInvocationName].concat(ARGV));

Давайте посмотрим, как это работает:

$ ./handling5.js --user=miguel http://www.google.com
Value of user: miguel
http://www.google.com
$ ./handling5.js -U miguel /home/miguel/doc
Value of user: miguel
file:///home/miguel/doc
./handling5.js -U
Missing argument for -U
$ ./handling5.js -h
Usage:
  gjs [OPTION...]
Help Options:
  -h, --help                 Show help options
  --help-all                 Show all help options
  --help-gapplication        Show GApplication options
Application Options:
  -v, --version              Shows program version
  -U, --user=USER            User Name

Удивительно, теперь у нас есть много возможностей с очень небольшими изменениями в нашем коде и, кроме того, бесплатно (если у вас есть «ванильный GNOME», вам не нужно устанавливать какую-либо другую библиотеку) .

В методе add_main_option есть еще много опций, я только что показал некоторые из них, поэтому я призываю вас более подробно изучить, что еще — этот метод — может предложить.

Надеюсь, вам понравилась эта серия.