use crate::Rational;
use core::str::FromStr;
use malachite_base::num::basic::traits::One;
use malachite_nz::natural::Natural;
impl FromStr for Rational {
type Err = ();
#[inline]
fn from_str(s: &str) -> Result<Self, ()> {
let (abs_string, sign) = if let Some(abs_string) = s.strip_prefix('-') {
if abs_string.starts_with('+') {
return Err(());
}
(abs_string, false)
} else {
(s, true)
};
let numerator;
let denominator;
if let Some(slash_index) = abs_string.find('/') {
numerator = Natural::from_str(&abs_string[..slash_index])?;
denominator = Natural::from_str(&abs_string[slash_index + 1..])?;
if denominator == 0u32 {
return Err(());
}
} else {
numerator = Natural::from_str(abs_string)?;
denominator = Natural::ONE;
}
Ok(Self::from_sign_and_naturals(sign, numerator, denominator))
}
}