Clap не может проанализировать файл YAML: не удалось преобразовать значение YAML String (1) в строку

Я использую файл YAML для определения интерфейса командной строки. Я разбираю файл с помощью макроса Clap load_yaml!, который некоторое время работал нормально:

#[macro_use]
extern crate clap;
use clap::{App, ArgMatches};

fn main() {
    let yml = load_yaml!("cl_arguments.yml");
    let matches = App::from_yaml(yml).get_matches();
    # some code goes here
}

Если я не внес никаких изменений в соответствующий код, это перестало работать, и я получил следующую ошибку:

thread 'main' panicked at 'failed to convert YAML String("1") value to a string',
/home/me/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-2.31.2/src/args/arg.rs:112:28

Не уверен, виновато ли в этом обновление. Я обновил Rust и удалил Cargo.lock, чтобы исключить проблемы несовместимости, но это не помогло.

Это минимальная версия моего файла YAML, которая вызывает ошибку:

name: "tool"
version: "0.1"
about: "description"
author: "m00am"

subcommands:
  - subcommand1:
      args:
        - path:
            index: "1"
            required: true
            default_value: "/tmp/"
            help: "Dummy Path"
  - subcommand2:
      args:
         - other_path:
             index: "1"
             required: true
             help: "A second dummy path"

Это известная проблема? Что здесь пошло не так? Могу ли я что-нибудь сделать, кроме опробования комбинаций старых версий Clap и YAML crate?

Информация о версии

Выдержка из Cargo.toml

[dependencies]
rand = "*"
cute = "0.3.0"
fasthash = "*"
bio = "*"
rulinalg = "*"
serde = "*"
serde_derive = "*"
bincode = "*"
statrs = "*"
separator = "*"
termion = "*"
sysinfo = "*"
clap = { version = "*", features = ["yaml"] }
needletail = "*"
gnuplot = "*"
time = "*"
cue = "*"

Выдержка из Cargo.lock

[[package]]
name = "clap"
version = "2.31.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

...

[[package]]
name = "yaml-rust"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"

person m00am    schedule 20.04.2018    source источник
comment
Вы можете показать свой Cargo.toml? К каким версиям ящиков привязаны зависимости проекта?   -  person E_net4 the curator    schedule 20.04.2018
comment
Ой. Да, это может быть полезная информация ...   -  person m00am    schedule 20.04.2018


Ответы (1)


Свойство index в спецификации аргумента должно быть целым числом, а не строкой. Пример позиционного аргумента с явным индексом можно найти в документации . Удалите кавычки вокруг этого значения, и файл конфигурации снова заработает.

name: "tool"
version: "0.1"
about: "description"
author: "m00am"

subcommands:
  - subcommand1:
      args:
        - path:
            index: 1
            required: true
            default_value: "/tmp/"
            help: "Dummy Path"
  - subcommand2:
      args:
         - other_path:
             index: 1
             required: true
             help: "A second dummy path"
$ cargo run -- subcommand1 --help

USAGE:
    tool subcommand1 <path>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

ARGS:
    <path>    Dummy Path [default: /tmp/]

Я не мог определить причину, по которой это работало в предыдущих версиях. Есть шанс, что реализация позволила выйти за рамки предполагаемой функциональности. В противном случае это могло быть критическое изменение по сравнению с ранней версией Clap с поддержкой конфигурации YAML. Зависимости в вашем файле Cargo.toml слишком гибкие для долгосрочного использования и повышают вероятность возникновения этих проблем. Придерживаться диапазонов версий по умолчанию (вставка) обычно является правильным (см. указание зависимостей).

person E_net4 the curator    schedule 20.04.2018
comment
Спасибо за ваш ответ. Я уже многому научился здесь. Однако я мог запутать реальную ошибку при создании своего минимального примера. Изначально ошибка была thread 'main' panicked at 'failed to convert YAML Integer(1) value to a string, поэтому я сделал их строками. Со значениями индекса как целыми числами у меня работает минимальный пример, а вот мой фактический файл - нет. Я изменю заголовок вопроса, чтобы он лучше соответствовал описанной здесь ошибке, проведу дополнительное исследование и, возможно, задам новый вопрос с более подробным описанием моей проблемы. - person m00am; 21.04.2018
comment
Оказывается, я добавил default_value с целым числом вместо строки, что и стало причиной этой ошибки. Спасибо за помощь. - person m00am; 23.04.2018