rust clap 解析 ipv4Addr

rust clap parse ipv4Addr

我想使用 clap derive API 来解析 Ipv4Addr

#![allow(unused)]
use clap; // 3.1.6
use clap::Parser;
use std::net::Ipv4Addr;

#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
    
    #[clap(short, long, parse(from_str))]
    ip_dst: Ipv4Addr,

}

fn main() {
    let args = Args::parse();
}

我的尝试给出了以下错误,即使 Ipv4Addr 似乎实现了提供 from_str

FromStr
error[E0277]: the trait bound `Ipv4Addr: From<&str>` is not satisfied
  --> src/main.rs:10:31
   |
10 |     #[clap(short, long, parse(from_str))]
   |                               ^^^^^^^^ the trait `From<&str>` is not implemented for `Ipv4Addr`
   |
   = help: the following implementations were found:
             <Ipv4Addr as From<[u8; 4]>>
             <Ipv4Addr as From<u32>>

For more information about this error, try `rustc --explain E0277`.

我的问题是:

你想要的是默认使用的(因为Ipv4Addr实现了FromStr),没有指定任何parse选项:

use clap; // 3.1.6
use clap::Parser;
use std::net::Ipv4Addr;

#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
    #[clap(short, long)]
    ip_dst: Ipv4Addr,
}

Playground

否则,您需要按照示例使用try_from_str

#![allow(unused)]
use clap; // 3.1.6
use clap::Parser;
use std::net::Ipv4Addr;

#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
    
    #[clap(short, long, parse(try_from_str))]
    ip_dst: Ipv4Addr,

}

Playground

Ipv4Addr 实施 FromStr but not From<&str> which is the From trait with &str as a parameter. If you want to use FromStr, specify parse(try_from_str) or omit it since it's the default.