foundry_cli/opts/
chain.rs1use clap::builder::{PossibleValuesParser, TypedValueParser};
2use eyre::Result;
3use foundry_config::{Chain, NamedChain};
4use std::ffi::OsStr;
5
6#[derive(Clone, Debug)]
10pub struct ChainValueParser {
11 pub inner: PossibleValuesParser,
12}
13
14impl Default for ChainValueParser {
15 fn default() -> Self {
16 Self { inner: PossibleValuesParser::from(NamedChain::VARIANT_NAMES) }
17 }
18}
19
20impl TypedValueParser for ChainValueParser {
21 type Value = Chain;
22
23 fn parse_ref(
24 &self,
25 cmd: &clap::Command,
26 arg: Option<&clap::Arg>,
27 value: &OsStr,
28 ) -> Result<Self::Value, clap::Error> {
29 let s =
30 value.to_str().ok_or_else(|| clap::Error::new(clap::error::ErrorKind::InvalidUtf8))?;
31 if let Ok(id) = s.parse() {
32 Ok(Chain::from_id(id))
33 } else {
34 s.parse()
40 .map_err(|_| self.inner.parse_ref(cmd, arg, value).unwrap_err())
41 .map(Chain::from_named)
42 }
43 }
44}