/***********************************************************************************************************************************
Test Build Config
***********************************************************************************************************************************/
#include "common/harnessStorage.h"

/***********************************************************************************************************************************
Test Run
***********************************************************************************************************************************/
static void
testRun(void)
{
    FUNCTION_HARNESS_VOID();

    // Create default storage object for testing
    Storage *storageTest = storagePosixNewP(TEST_PATH_STR, .write = true);

    // *****************************************************************************************************************************
    if (testBegin("bldCfgParse() and bldCfgRender()"))
    {
        // -------------------------------------------------------------------------------------------------------------------------
        TEST_TITLE("command parse errors");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            "command:\n"
            "  archive-get:\n"
            "    bogus: test\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "unknown command definition 'bogus'");

        #define TEST_COMMAND_VALID                                                                                                 \
            "command:\n"                                                                                                           \
            "  archive-get:\n"                                                                                                     \
            "    internal: true\n"                                                                                                 \
            "\n"

        #define TEST_OPTION_GROUP_VALID                                                                                            \
            "optionGroup:\n"                                                                                                       \
            "  repo: {}\n"                                                                                                         \
            "\n"

        // -------------------------------------------------------------------------------------------------------------------------
        TEST_TITLE("option parse errors");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    bogus: test\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "unknown option definition 'bogus'");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    section: global\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "option 'config' requires 'type'");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    depend:\n"
            "      bogus: test\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "unknown depend definition 'bogus'");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    command:\n"
            "      backup:\n"
            "        bogus: test\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "unknown option command definition 'bogus'");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    depend: bogus\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "dependency inherited from option 'bogus' before it is defined");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    type: string\n"
            "    command:\n"
            "      bogus: {}\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "invalid command 'bogus' in option 'config' command list");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    type: string\n"
            "    depend:\n"
            "      option: bogus\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "dependency on undefined option 'bogus'");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    type: string\n"
            "    group: bogus\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "option 'config' has invalid group 'bogus'");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  stanza:\n"
            "    type: string\n"
            "  config:\n"
            "    type: string\n"
            "    depend:\n"
            "      option: online\n"
            "  online:\n"
            "    type: boolean\n"
            "    depend:\n"
            "      option: config\n");

        TEST_ERROR(
            bldCfgParse(storageTest), FormatError,
            "unable to resolve dependencies for option(s) 'config, online'\n"
            "HINT: are there circular dependencies?");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    type: string\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "option 'stanza' must exist");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    type: string\n"
            "  stanza:\n"
            "    type: string\n"
            "    depend:\n"
            "      option: config\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "option 'stanza' may not depend on other option");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            TEST_COMMAND_VALID
            TEST_OPTION_GROUP_VALID
            "option:\n"
            "  config:\n"
            "    type: string\n"
            "  stanza:\n"
            "    type: string\n"
            "    command:\n"
            "      archive-get:\n"
            "        depend:\n"
            "          option: config\n");

        TEST_ERROR(bldCfgParse(storageTest), FormatError, "option 'stanza' command 'archive-get' may not depend on other option");

        // -------------------------------------------------------------------------------------------------------------------------
        TEST_TITLE("parse and render config");

        HRN_STORAGE_PUT_Z(
            storageTest, "src/build/config/config.yaml",
            "command:\n"
            "  archive-get:\n"
            "    command-role:\n"
            "      async: {}\n"
            "      local: {}\n"
            "      remote: {}\n"
            "    lock-type: archive\n"
            "    log-file: false\n"
            "    log-level-default: debug\n"
            "    parameter-allowed: true\n"
            "\n"
            "  backup:\n"
            "    internal: true\n"
            "    command-role:\n"
            "      local: {}\n"
            "      remote: {}\n"
            "    lock-type: backup\n"
            "    lock-required: true\n"
            "    lock-remote-required: true\n"
            "\n"
            "  help: {}\n"
            "\n"
            "  version: {}\n"
            "\n"
            "optionGroup:\n"
            "  pg: {}\n"
            "  repo: {}\n"
            "\n"
            "option:\n"
            "  timeout:\n"
            "    type: time\n"
            "    default: 10\n"
            "    command:\n"
            "      backup:\n"
            "        default: 20\n"
            "      archive-get:\n"
            "        default: 30\n"
            "    allow-range: [5, 50]\n"
            "\n"
            "  buffer-size:\n"
            "    section: global\n"
            "    type: size\n"
            "    command:\n"
            "      backup: {}\n"
            "      archive-get:\n"
            "        default: 32768\n"
            "        allow-list:\n"
            "          - 32768\n"
            "    allow-list:\n"
            "      - 8192\n"
            "      - 16384\n"
            "    command-role:\n"
            "      main: {}\n"
            "\n"
            "  compress-network:\n"
            "    section: global\n"
            "    type: string-id\n"
            "    command:\n"
            "      backup:\n"
            "        allow-list:\n"
            "          - gz\n"
            "    command-role:\n"
            "      main: {}\n"
            "\n"
            "  compress-type:\n"
            "    section: global\n"
            "    type: string\n"
            "    default: gz\n"
            "    command:\n"
            "      backup: {}\n"
            "      archive-get:\n"
            "        depend:\n"
            "          option: config\n"
            "    command-role: {}\n"
            "    deprecate:\n"
            "      compress: {}\n"
            "\n"
            "  compress-level:\n"
            "    section: global\n"
            "    type: integer\n"
            "    required: false\n"
            "    allow-range: [0, 9]\n"
            "    command: compress-type\n"
            "    depend: compress-type\n"
            "\n"
            "  compress-level-network:\n"
            "    inherit: compress-level\n"
            "    internal: true\n"
            "    secure: true\n"
            "    default: ~\n"
            "    depend:\n"
            "      option: compress-type\n"
            "      list:\n"
            "        - none\n"
            "        - gz\n"
            "\n"
            "  config:\n"
            "    type: string\n"
            "    default: CFGOPTDEF_CONFIG_PATH \"/\" PROJECT_CONFIG_FILE\n"
            "    default-literal: true\n"
            "    negate: true\n"
            "    command:\n"
            "      backup: {}\n"
            "      archive-get:\n"
            "        default: CFGOPTDEF_CONFIG_PATH \"/.\" PROJECT_CONFIG_FILE\n"
            "\n"
            "  config-include:\n"
            "    section: global\n"
            "    type: path\n"
            "    default: /include\n"
            "    command-role:\n"
            "      main: {}\n"
            "\n"
            "  log-level-console:\n"
            "    section: global\n"
            "    type: string-id\n"
            "    default: warn\n"
            "    allow-list:\n"
            "      - off\n"
            "      - error\n"
            "      - warn\n"
            "      - debug1\n"
            "\n"
            "  log-level-file:\n"
            "    section: global\n"
            "    type: string-id\n"
            "    default: info\n"
            "    allow-list: log-level-console\n"
            "    command:\n"
            "      backup:\n"
            "        internal: true\n"
            "        required: false\n"
            "        default: warn\n"
            "        allow-list:\n"
            "          - off\n"
            "          - warn\n"
            "        depend:\n"
            "          option: log-level-console\n"
            "          list:\n"
            "            - warn\n"
            "        command-role:\n"
            "          main: {}\n"
            "      help: {}\n"
            "      archive-get:\n"
            "        default: ~\n"
            "\n"
            "  stanza:\n"
            "    type: list\n"
            "    command:\n"
            "      archive-get: {}\n"
            "      backup: {}\n"
            "\n"
            "  online:\n"
            "    type: boolean\n"
            "    default: true\n"
            "    command:\n"
            "      backup:\n"
            "        default: false\n"
            "    command-role:\n"
            "      main: {}\n"
            "    deprecate:\n"
            "      online-old: {}\n"
            "\n"
            "  backup-standby:\n"
            "    section: global\n"
            "    type: boolean\n"
            "    default: false\n"
            "    depend:\n"
            "      option: online\n"
            "      list:\n"
            "        - true\n"
            "    command:\n"
            "      backup: {}\n"
            "    command-role:\n"
            "      async: {}\n"
            "      main: {}\n"
            "    deprecate:\n"
            "      backup-standby-old: {}\n"
            "\n"
            "  pg-path:\n"
            "    section: stanza\n"
            "    group: pg\n"
            "    type: hash\n"
            "    deprecate:\n"
            "      pg-path: {}\n"
            "      pg?-path-indexed: {}\n"
            "      db-path: {}\n"
            "      db?-path: {}\n"
            "\n"
            "  pg-host:\n"
            "    section: stanza\n"
            "    group: pg\n"
            "    type: string\n"
            "    command:\n"
            "      archive-get:\n"
            "        default: host1\n"
            "      backup: {}\n"
            "    deprecate:\n"
            "      pg?-host: {}\n");

        TEST_RESULT_VOID(bldCfgRender(storageTest, bldCfgParse(storageTest)), "parse and render");

        // -------------------------------------------------------------------------------------------------------------------------
        TEST_TITLE("bldCfgRenderVar128Size()");

        TEST_RESULT_UINT(bldCfgRenderVar128Size(10000), 2, "check size");

        // -------------------------------------------------------------------------------------------------------------------------
        TEST_TITLE("check config.auto.h");

        TEST_STORAGE_GET(
            storageTest,
            "src/config/config.auto.h",
            COMMENT_BLOCK_BEGIN "\n"
            "Command and Option Configuration\n"
            "\n"
            "Automatically generated by 'make build-config' -- do not modify directly.\n"
            COMMENT_BLOCK_END "\n"
            "#ifndef CONFIG_CONFIG_AUTO_H\n"
            "#define CONFIG_CONFIG_AUTO_H\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Command constants\n"
            COMMENT_BLOCK_END "\n"
            "#define CFGCMD_ARCHIVE_GET                                          \"archive-get\"\n"
            "#define CFGCMD_BACKUP                                               \"backup\"\n"
            "#define CFGCMD_HELP                                                 \"help\"\n"
            "#define CFGCMD_VERSION                                              \"version\"\n"
            "\n"
            "#define CFG_COMMAND_TOTAL                                           4\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Option group constants\n"
            COMMENT_BLOCK_END "\n"
            "#define CFG_OPTION_GROUP_TOTAL                                      2\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Option constants\n"
            COMMENT_BLOCK_END "\n"
            "#define CFGOPT_BACKUP_STANDBY                                       \"backup-standby\"\n"
            "#define CFGOPT_BUFFER_SIZE                                          \"buffer-size\"\n"
            "#define CFGOPT_COMPRESS_LEVEL                                       \"compress-level\"\n"
            "#define CFGOPT_COMPRESS_LEVEL_NETWORK                               \"compress-level-network\"\n"
            "#define CFGOPT_COMPRESS_NETWORK                                     \"compress-network\"\n"
            "#define CFGOPT_COMPRESS_TYPE                                        \"compress-type\"\n"
            "#define CFGOPT_CONFIG                                               \"config\"\n"
            "#define CFGOPT_CONFIG_INCLUDE                                       \"config-include\"\n"
            "#define CFGOPT_LOG_LEVEL_CONSOLE                                    \"log-level-console\"\n"
            "#define CFGOPT_LOG_LEVEL_FILE                                       \"log-level-file\"\n"
            "#define CFGOPT_ONLINE                                               \"online\"\n"
            "#define CFGOPT_STANZA                                               \"stanza\"\n"
            "#define CFGOPT_TIMEOUT                                              \"timeout\"\n"
            "\n"
            "#define CFG_OPTION_TOTAL                                            15\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Option value constants\n"
            COMMENT_BLOCK_END "\n"
            "#define CFGOPTVAL_COMPRESS_NETWORK_GZ                               STRID5(\"gz\", 0x3470)\n"
            "#define CFGOPTVAL_COMPRESS_NETWORK_GZ_Z                             \"gz\"\n"
            "\n"
            "#define CFGOPTVAL_LOG_LEVEL_CONSOLE_DEBUG1                          STRID6(\"debug1\", 0x7475421441)\n"
            "#define CFGOPTVAL_LOG_LEVEL_CONSOLE_DEBUG1_Z                        \"debug1\"\n"
            "#define CFGOPTVAL_LOG_LEVEL_CONSOLE_ERROR                           STRID5(\"error\", 0x127ca450)\n"
            "#define CFGOPTVAL_LOG_LEVEL_CONSOLE_ERROR_Z                         \"error\"\n"
            "#define CFGOPTVAL_LOG_LEVEL_CONSOLE_OFF                             STRID5(\"off\", 0x18cf0)\n"
            "#define CFGOPTVAL_LOG_LEVEL_CONSOLE_OFF_Z                           \"off\"\n"
            "#define CFGOPTVAL_LOG_LEVEL_CONSOLE_WARN                            STRID5(\"warn\", 0x748370)\n"
            "#define CFGOPTVAL_LOG_LEVEL_CONSOLE_WARN_Z                          \"warn\"\n"
            "\n"
            "#define CFGOPTVAL_LOG_LEVEL_FILE_DEBUG1                             STRID6(\"debug1\", 0x7475421441)\n"
            "#define CFGOPTVAL_LOG_LEVEL_FILE_DEBUG1_Z                           \"debug1\"\n"
            "#define CFGOPTVAL_LOG_LEVEL_FILE_ERROR                              STRID5(\"error\", 0x127ca450)\n"
            "#define CFGOPTVAL_LOG_LEVEL_FILE_ERROR_Z                            \"error\"\n"
            "#define CFGOPTVAL_LOG_LEVEL_FILE_OFF                                STRID5(\"off\", 0x18cf0)\n"
            "#define CFGOPTVAL_LOG_LEVEL_FILE_OFF_Z                              \"off\"\n"
            "#define CFGOPTVAL_LOG_LEVEL_FILE_WARN                               STRID5(\"warn\", 0x748370)\n"
            "#define CFGOPTVAL_LOG_LEVEL_FILE_WARN_Z                             \"warn\"\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Command enum\n"
            COMMENT_BLOCK_END "\n"
            "typedef enum\n"
            "{\n"
            "    cfgCmdArchiveGet,\n"
            "    cfgCmdBackup,\n"
            "    cfgCmdHelp,\n"
            "    cfgCmdVersion,\n"
            "    cfgCmdNone,\n"
            "} ConfigCommand;\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Option group enum\n"
            COMMENT_BLOCK_END "\n"
            "typedef enum\n"
            "{\n"
            "    cfgOptGrpPg,\n"
            "    cfgOptGrpRepo,\n"
            "} ConfigOptionGroup;\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Option enum\n"
            COMMENT_BLOCK_END "\n"
            "typedef enum\n"
            "{\n"
            "    cfgOptBackupStandby,\n"
            "    cfgOptBufferSize,\n"
            "    cfgOptCompressLevel,\n"
            "    cfgOptCompressLevelNetwork,\n"
            "    cfgOptCompressNetwork,\n"
            "    cfgOptCompressType,\n"
            "    cfgOptConfig,\n"
            "    cfgOptConfigInclude,\n"
            "    cfgOptLogLevelConsole,\n"
            "    cfgOptLogLevelFile,\n"
            "    cfgOptOnline,\n"
            "    cfgOptPgHost,\n"
            "    cfgOptPgPath,\n"
            "    cfgOptStanza,\n"
            "    cfgOptTimeout,\n"
            "} ConfigOption;\n"
            "\n"
            "#endif\n");

        // -------------------------------------------------------------------------------------------------------------------------
        TEST_TITLE("check parse.auto.c");

        TEST_STORAGE_GET(
            storageTest,
            "src/config/parse.auto.c",
            COMMENT_BLOCK_BEGIN "\n"
            "Config Parse Rules\n"
            "\n"
            "Automatically generated by 'make build-config' -- do not modify directly.\n"
            COMMENT_BLOCK_END "\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Rule Strings\n"
            COMMENT_BLOCK_END "\n"
            "#define PARSE_RULE_VAL_STR(value)                                   PARSE_RULE_U32_1(value)\n"
            "\n"
            "static const StringPub parseRuleValueStr[] =\n"
            "{\n"
            "    PARSE_RULE_STRPUB(\"/include\"),\n"
            "    PARSE_RULE_STRPUB(\"10\"),\n"
            "    PARSE_RULE_STRPUB(\"20\"),\n"
            "    PARSE_RULE_STRPUB(\"30\"),\n"
            "    PARSE_RULE_STRPUB(\"32768\"),\n"
            "    PARSE_RULE_STRPUB(\"gz\"),\n"
            "    PARSE_RULE_STRPUB(\"host1\"),\n"
            "    PARSE_RULE_STRPUB(\"info\"),\n"
            "    PARSE_RULE_STRPUB(\"warn\"),\n"
            "    PARSE_RULE_STRPUB(CFGOPTDEF_CONFIG_PATH \"/\" PROJECT_CONFIG_FILE),\n"
            "    PARSE_RULE_STRPUB(CFGOPTDEF_CONFIG_PATH \"/.\" PROJECT_CONFIG_FILE),\n"
            "};\n"
            "\n"
            "typedef enum\n"
            "{\n"
            "    parseRuleValStrQT_FS_include_QT,\n"
            "    parseRuleValStrQT_10_QT,\n"
            "    parseRuleValStrQT_20_QT,\n"
            "    parseRuleValStrQT_30_QT,\n"
            "    parseRuleValStrQT_32768_QT,\n"
            "    parseRuleValStrQT_gz_QT,\n"
            "    parseRuleValStrQT_host1_QT,\n"
            "    parseRuleValStrQT_info_QT,\n"
            "    parseRuleValStrQT_warn_QT,\n"
            "    parseRuleValStrCFGOPTDEF_CONFIG_PATH_SP_QT_FS_QT_SP_PROJECT_CONFIG_FILE,\n"
            "    parseRuleValStrCFGOPTDEF_CONFIG_PATH_SP_QT_FS_DT_QT_SP_PROJECT_CONFIG_FILE,\n"
            "} ParseRuleValueStr;\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Rule StringIds\n"
            COMMENT_BLOCK_END "\n"
            "#define PARSE_RULE_VAL_STRID(value)                                 PARSE_RULE_U32_1(value)\n"
            "\n"
            "static const StringId parseRuleValueStrId[] =\n"
            "{\n"
            "    STRID6(\"debug1\", 0x7475421441),\n"
            "    STRID5(\"error\", 0x127ca450),\n"
            "    STRID5(\"gz\", 0x3470),\n"
            "    STRID5(\"info\", 0x799c90),\n"
            "    STRID5(\"off\", 0x18cf0),\n"
            "    STRID5(\"warn\", 0x748370),\n"
            "};\n"
            "\n"
            "typedef enum\n"
            "{\n"
            "    parseRuleValStrIdDebug1,\n"
            "    parseRuleValStrIdError,\n"
            "    parseRuleValStrIdGz,\n"
            "    parseRuleValStrIdInfo,\n"
            "    parseRuleValStrIdOff,\n"
            "    parseRuleValStrIdWarn,\n"
            "} ParseRuleValueStrId;\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Rule Ints\n"
            COMMENT_BLOCK_END "\n"
            "#define PARSE_RULE_VAL_INT(value)                                   PARSE_RULE_U32_1(value)\n"
            "\n"
            "static const int64_t parseRuleValueInt[] =\n"
            "{\n"
            "    0,\n"
            "    9,\n"
            "    5000,\n"
            "    8192,\n"
            "    10000,\n"
            "    16384,\n"
            "    20000,\n"
            "    30000,\n"
            "    32768,\n"
            "    50000,\n"
            "};\n"
            "\n"
            "typedef enum\n"
            "{\n"
            "    parseRuleValInt0,\n"
            "    parseRuleValInt9,\n"
            "    parseRuleValInt5000,\n"
            "    parseRuleValInt8192,\n"
            "    parseRuleValInt10000,\n"
            "    parseRuleValInt16384,\n"
            "    parseRuleValInt20000,\n"
            "    parseRuleValInt30000,\n"
            "    parseRuleValInt32768,\n"
            "    parseRuleValInt50000,\n"
            "} ParseRuleValueInt;\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Command parse data\n"
            COMMENT_BLOCK_END "\n"
            "#define PARSE_RULE_VAL_CMD(value)                                   PARSE_RULE_U32_1(value)\n"
            "\n"
            "static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =\n"
            "{\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_COMMAND\n"
            "    (\n"
            "        PARSE_RULE_COMMAND_NAME(\"archive-get\"),\n"
            "        PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeArchive),\n"
            "        PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug),\n"
            "        PARSE_RULE_COMMAND_PARAMETER_ALLOWED(true),\n"
            "\n"
            "        PARSE_RULE_COMMAND_ROLE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleAsync)\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleLocal)\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleMain)\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleRemote)\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_COMMAND\n"
            "    (\n"
            "        PARSE_RULE_COMMAND_NAME(\"backup\"),\n"
            "        PARSE_RULE_COMMAND_LOCK_REQUIRED(true),\n"
            "        PARSE_RULE_COMMAND_LOCK_REMOTE_REQUIRED(true),\n"
            "        PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeBackup),\n"
            "        PARSE_RULE_COMMAND_LOG_FILE(true),\n"
            "        PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),\n"
            "\n"
            "        PARSE_RULE_COMMAND_ROLE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleLocal)\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleMain)\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleRemote)\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_COMMAND\n"
            "    (\n"
            "        PARSE_RULE_COMMAND_NAME(\"help\"),\n"
            "        PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),\n"
            "        PARSE_RULE_COMMAND_LOG_FILE(true),\n"
            "        PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),\n"
            "\n"
            "        PARSE_RULE_COMMAND_ROLE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleMain)\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_COMMAND\n"
            "    (\n"
            "        PARSE_RULE_COMMAND_NAME(\"version\"),\n"
            "        PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeNone),\n"
            "        PARSE_RULE_COMMAND_LOG_FILE(true),\n"
            "        PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo),\n"
            "\n"
            "        PARSE_RULE_COMMAND_ROLE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_COMMAND_ROLE(cfgCmdRoleMain)\n"
            "        ),\n"
            "    ),\n"
            "};\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Option group parse data\n"
            COMMENT_BLOCK_END "\n"
            "static const ParseRuleOptionGroup parseRuleOptionGroup[CFG_OPTION_GROUP_TOTAL] =\n"
            "{\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION_GROUP\n"
            "    (\n"
            "        PARSE_RULE_OPTION_GROUP_NAME(\"pg\"),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION_GROUP\n"
            "    (\n"
            "        PARSE_RULE_OPTION_GROUP_NAME(\"repo\"),\n"
            "    ),\n"
            "};\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Option parse data\n"
            COMMENT_BLOCK_END "\n"
            "#define PARSE_RULE_VAL_OPT(value)                                   PARSE_RULE_U32_1(value)\n"
            "\n"
            "static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =\n"
            "{\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"backup-standby\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeBoolean),\n"
            "        PARSE_RULE_OPTION_NEGATE(true),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_DEPEND\n"
            "                (\n"
            "                    PARSE_RULE_VAL_OPT(cfgOptOnline),\n"
            "                    PARSE_RULE_VAL_BOOL_TRUE,\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_BOOL_FALSE,\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"buffer-size\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeSize),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdArchiveGet),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_LIST\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt32768),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt32768),\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_32768_QT),\n"
            "                ),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_LIST\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt8192),\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt16384),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"compress-level\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeInteger),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(false),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdArchiveGet),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEPEND\n"
            "                (\n"
            "                    PARSE_RULE_VAL_OPT(cfgOptConfig),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_RANGE\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt0),\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt9),\n"
            "                ),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_RANGE\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt0),\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt9),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"compress-level-network\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeInteger),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(false),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "        PARSE_RULE_OPTION_SECURE(true),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdArchiveGet),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEPEND\n"
            "                (\n"
            "                    PARSE_RULE_VAL_OPT(cfgOptConfig),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_RANGE\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt0),\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt9),\n"
            "                ),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_DEPEND\n"
            "                (\n"
            "                    PARSE_RULE_VAL_OPT(cfgOptCompressType),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdNone),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdGz),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_RANGE\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt0),\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt9),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"compress-network\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeStringId),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdBackup),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_LIST\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdGz),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"compress-type\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeString),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdArchiveGet),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEPEND\n"
            "                (\n"
            "                    PARSE_RULE_VAL_OPT(cfgOptConfig),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_gz_QT),\n"
            "                ),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_gz_QT),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"config\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeString),\n"
            "        PARSE_RULE_OPTION_NEGATE(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionCommandLine),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdArchiveGet),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrCFGOPTDEF_CONFIG_PATH_SP_QT_FS_DT_QT_SP_PROJECT_CONFIG_FILE),\n"
            "                ),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrCFGOPTDEF_CONFIG_PATH_SP_QT_FS_QT_SP_PROJECT_CONFIG_FILE),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"config-include\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypePath),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_FS_include_QT),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"log-level-console\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeStringId),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_LIST\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdOff),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdError),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdWarn),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdDebug1),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdWarn),\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_warn_QT),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"log-level-file\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeStringId),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionGlobal),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdHelp)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdBackup),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEPEND\n"
            "                (\n"
            "                    PARSE_RULE_VAL_OPT(cfgOptLogLevelConsole),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdWarn),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_LIST\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdOff),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdWarn),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdWarn),\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_warn_QT),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_NOT_REQUIRED(),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_LIST\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdOff),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdError),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdWarn),\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdDebug1),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STRID(parseRuleValStrIdInfo),\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_info_QT),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"online\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeBoolean),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionCommandLine),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdBackup),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_BOOL_FALSE,\n"
            "                ),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_BOOL_TRUE,\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"pg-host\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeString),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionStanza),\n"
            "        PARSE_RULE_OPTION_GROUP_MEMBER(true),\n"
            "        PARSE_RULE_OPTION_GROUP_ID(cfgOptGrpPg),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdArchiveGet),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_host1_QT),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"pg-path\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeHash),\n"
            "        PARSE_RULE_OPTION_RESET(true),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionStanza),\n"
            "        PARSE_RULE_OPTION_MULTI(true),\n"
            "        PARSE_RULE_OPTION_GROUP_MEMBER(true),\n"
            "        PARSE_RULE_OPTION_GROUP_ID(cfgOptGrpPg),\n"
            "        PARSE_RULE_OPTION_DEPRECATE_MATCH(true),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"stanza\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeList),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionCommandLine),\n"
            "        PARSE_RULE_OPTION_MULTI(true),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "    ),\n"
            "\n"
            COMMENT_SEPARATOR "\n"
            "    PARSE_RULE_OPTION\n"
            "    (\n"
            "        PARSE_RULE_OPTION_NAME(\"timeout\"),\n"
            "        PARSE_RULE_OPTION_TYPE(cfgOptTypeTime),\n"
            "        PARSE_RULE_OPTION_REQUIRED(true),\n"
            "        PARSE_RULE_OPTION_SECTION(cfgSectionCommandLine),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_ASYNC_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_LOCAL_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST\n"
            "        (\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet)\n"
            "            PARSE_RULE_OPTION_COMMAND(cfgCmdBackup)\n"
            "        ),\n"
            "\n"
            "        PARSE_RULE_OPTIONAL\n"
            "        (\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdArchiveGet),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_RANGE\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt5000),\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt50000),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt30000),\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_30_QT),\n"
            "                ),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_FILTER_CMD\n"
            "                (\n"
            "                    PARSE_RULE_VAL_CMD(cfgCmdBackup),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_RANGE\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt5000),\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt50000),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt20000),\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_20_QT),\n"
            "                ),\n"
            "            ),\n"
            "\n"
            "            PARSE_RULE_OPTIONAL_GROUP\n"
            "            (\n"
            "                PARSE_RULE_OPTIONAL_ALLOW_RANGE\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt5000),\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt50000),\n"
            "                ),\n"
            "\n"
            "                PARSE_RULE_OPTIONAL_DEFAULT\n"
            "                (\n"
            "                    PARSE_RULE_VAL_INT(parseRuleValInt10000),\n"
            "                    PARSE_RULE_VAL_STR(parseRuleValStrQT_10_QT),\n"
            "                ),\n"
            "            ),\n"
            "        ),\n"
            "    ),\n"
            "};\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Option deprecations\n"
            COMMENT_BLOCK_END "\n"
            "#define CFG_OPTION_DEPRECATE_TOTAL                                  7\n"
            "\n"
            "static const ParseRuleOptionDeprecate parseRuleOptionDeprecate[CFG_OPTION_DEPRECATE_TOTAL] =\n"
            "{\n"
            "    // backup-standby deprecation\n"
            "    {\n"
            "        .name = \"backup-standby-old\",\n"
            "        .id = cfgOptBackupStandby,\n"
            "        .unindexed = true,\n"
            "    },\n"
            "\n"
            "    // compress-type deprecation\n"
            "    {\n"
            "        .name = \"compress\",\n"
            "        .id = cfgOptCompressType,\n"
            "        .unindexed = true,\n"
            "    },\n"
            "\n"
            "    // pg-path deprecation\n"
            "    {\n"
            "        .name = \"db-path\",\n"
            "        .id = cfgOptPgPath,\n"
            "        .indexed = true,\n"
            "        .unindexed = true,\n"
            "    },\n"
            "\n"
            "    // online deprecation\n"
            "    {\n"
            "        .name = \"online-old\",\n"
            "        .id = cfgOptOnline,\n"
            "        .unindexed = true,\n"
            "    },\n"
            "\n"
            "    // pg-host deprecation\n"
            "    {\n"
            "        .name = \"pg-host\",\n"
            "        .id = cfgOptPgHost,\n"
            "        .indexed = true,\n"
            "    },\n"
            "\n"
            "    // pg-path deprecation\n"
            "    {\n"
            "        .name = \"pg-path\",\n"
            "        .id = cfgOptPgPath,\n"
            "        .unindexed = true,\n"
            "    },\n"
            "\n"
            "    // pg-path deprecation\n"
            "    {\n"
            "        .name = \"pg-path-indexed\",\n"
            "        .id = cfgOptPgPath,\n"
            "        .indexed = true,\n"
            "    },\n"
            "};\n"
            "\n"
            COMMENT_BLOCK_BEGIN "\n"
            "Order for option parse resolution\n"
            COMMENT_BLOCK_END "\n"
            "static const ConfigOption optionResolveOrder[] =\n"
            "{\n"
            "    cfgOptStanza,\n"
            "    cfgOptBufferSize,\n"
            "    cfgOptCompressNetwork,\n"
            "    cfgOptConfig,\n"
            "    cfgOptConfigInclude,\n"
            "    cfgOptLogLevelConsole,\n"
            "    cfgOptLogLevelFile,\n"
            "    cfgOptOnline,\n"
            "    cfgOptPgHost,\n"
            "    cfgOptPgPath,\n"
            "    cfgOptTimeout,\n"
            "    cfgOptBackupStandby,\n"
            "    cfgOptCompressLevel,\n"
            "    cfgOptCompressType,\n"
            "    cfgOptCompressLevelNetwork,\n"
            "};\n");
    }

    FUNCTION_HARNESS_RETURN_VOID();
}
