!! В данный момент модуль alterator-perl-functions меняется,
и вряд ли его стоит сейчас использовать. Надеюсь,
что вскоре он придет к какому-то более стабильному
состоянию... !!
alterator-perl-functions
Простейший бакенд выглядит следующим образом:
Поддержка переводов
- определена функция _()
- перед запуском message_loop надо выставить переменную
$TEXTDOMAIN. Если переменная не выставлена, модуль ругается
и выставляет ее в alterator-<имя бакенда>
- язык выставляется из параметра language заново для каждой команды. Значение по умолчанию 'en_EN'
Вывод
В процедуре on_message сделано перенаправление
STDOUT->STDERR. Все ответы должны выполняться только
специальными командами.
Самый низкий уровень абстракции. Возможно, потом получится от этих функций отказаться:
- write_plain($string1, ...) — запись произвольной строки
- write_begin() — запись "("
- write_end() — запись ")"
Запись пары «имя значение» для разных типов значений.
- write_string_param($name, $string1, ...) — защищаются символы " и \, выводится строка в кавычках
- write_bool_param($name, $string) — понимаются значения («on»,
“off”, “yes”, “no”, “true”, “false”, “y”, “n”, "#t”, "#f”, 1, 0).
В остальных случаях модуль ругается и записывает #f
- write_num_param($name, $num) — записывается число; если дали не число – ругается и записывает 0
Запись сообщений об ошибках.
- write_error($value1, ...) — обнуление всего предыдущего ответа + write_string_param('error', $value1, ...)
Автоматическое определение типа значений.
Так сложилось, что бакенды в альтератор посылают только
два типа параметров: string и bool (исключение – actions
constrains, но с ними надо, наверное, разбираться отдельно). Числа
всегда пишутся в виде строк.
- write_auto_param($name, $value, ...) — записать пару «имя
значение», если значение #t или #f — оно записывается
без кавычек, как bool, иначе – как строка.
- write_named_auto_list($name, @alist) — запись списка вида
"(name n1 v1 n2 v2 n3 v3)"... Пары n1 v1 и т.д. записываются
с помощью write_auto_param.
Кажется, что во всех разумных случаях достаточно использовать
функции write_error, write_auto_param и write_named_auto_list.
TODO:
* Хочется попробовать сделать еще один уровень
абстракции, в котором бакенд предоставляет только функции
для заполнения некоторой структуры данных и списки полей,
которые следует отдавать по командам read и list...
* Доделать проверку вывода бакенда. Проверять хотя бы, что все
скобки правильно закрыты, чтоб из бакенда нельзя было повесить
альтератор...
DEBUG
- Если переменная $DEBUG выставлена в ненулевое значение,
модуль выдает на stderr все полученные и отправленные
сообщения.
Использование
В данный момент alterator-perl-functions используется в одном модуле — alterator-xinetd