use super::*;
impl<E: Environment> Parser for Boolean<E> {
    #[inline]
    fn parse(string: &str) -> ParserResult<Self> {
        let (string, value) = alt((map(tag("true"), |_| true), map(tag("false"), |_| false)))(string)?;
        Ok((string, Boolean::new(value)))
    }
}
impl<E: Environment> FromStr for Boolean<E> {
    type Err = Error;
    #[inline]
    fn from_str(string: &str) -> Result<Self> {
        match Self::parse(string) {
            Ok((remainder, object)) => {
                ensure!(remainder.is_empty(), "Failed to parse string. Found invalid character in: \"{remainder}\"");
                Ok(object)
            }
            Err(error) => bail!("Failed to parse string. {error}"),
        }
    }
}
impl<E: Environment> Debug for Boolean<E> {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        Display::fmt(self, f)
    }
}
impl<E: Environment> Display for Boolean<E> {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        write!(f, "{}", self.boolean)
    }
}
#[cfg(test)]
mod tests {
    use super::*;
    use snarkvm_console_network_environment::Console;
    type CurrentEnvironment = Console;
    #[test]
    fn test_parse() -> Result<()> {
        assert!(Boolean::<CurrentEnvironment>::parse(Boolean::<CurrentEnvironment>::type_name()).is_err());
        assert!(Boolean::<CurrentEnvironment>::parse("").is_err());
        for boolean in &[true, false] {
            let expected = format!("{boolean}");
            let (remainder, candidate) = Boolean::<CurrentEnvironment>::parse(&expected).unwrap();
            assert_eq!(format!("{expected}"), candidate.to_string());
            assert_eq!("", remainder);
        }
        Ok(())
    }
    #[test]
    fn test_display() {
        fn check_display<E: Environment>(element: bool) {
            let candidate = Boolean::<E>::new(element);
            assert_eq!(format!("{element}"), format!("{candidate}"));
            let candidate_recovered = Boolean::<E>::from_str(&format!("{candidate}")).unwrap();
            assert_eq!(candidate, candidate_recovered);
        }
        check_display::<CurrentEnvironment>(false);
        check_display::<CurrentEnvironment>(true);
    }
    #[test]
    fn test_display_false() {
        let candidate = Boolean::<CurrentEnvironment>::new(false);
        assert_eq!("false", &format!("{candidate}"));
    }
    #[test]
    fn test_display_true() {
        let candidate = Boolean::<CurrentEnvironment>::new(true);
        assert_eq!("true", &format!("{candidate}"));
    }
}