use crate::arg::GivenRunnable;

impl clap::builder::ValueParserFactory for GivenRunnable {
    type Parser = GivenRunnableParser;
    fn value_parser() -> Self::Parser {
        GivenRunnableParser
    }
}

#[derive(Clone, Debug)]
pub struct GivenRunnableParser;
impl clap::builder::TypedValueParser for GivenRunnableParser {
    type Value = GivenRunnable;

    fn parse_ref(
        &self,
        _cmd: &clap::Command,
        _arg: Option<&clap::Arg>,
        value: &std::ffi::OsStr,
    ) -> Result<Self::Value, clap::Error> {
        if let Ok(value) = value.to_os_string().into_string() {
            GivenRunnable::try_from(value)
                .map_err(|_| clap::Error::new(clap::error::ErrorKind::InvalidValue))
        } else {
            Err(clap::Error::new(clap::error::ErrorKind::InvalidUtf8))
        }
    }
}