use crate::Rational;
use core::str::FromStr;
use malachite_base::num::basic::traits::One;
use malachite_base::num::conversion::traits::FromStringBase;
use malachite_nz::natural::Natural;
impl FromStringBase for Rational {
fn from_string_base(base: u8, s: &str) -> Option<Self> {
let (abs_string, sign) = if let Some(abs_string) = s.strip_prefix('-') {
if abs_string.starts_with('+') {
return None;
}
(abs_string, false)
} else {
(s, true)
};
let numerator;
let denominator;
if let Some(slash_index) = abs_string.find('/') {
numerator = Natural::from_string_base(base, &abs_string[..slash_index])?;
denominator = Natural::from_string_base(base, &abs_string[slash_index + 1..])?;
if denominator == 0u32 {
return None;
}
} else {
numerator = Natural::from_string_base(base, abs_string)?;
denominator = Natural::ONE;
}
Some(Self::from_sign_and_naturals(sign, numerator, denominator))
}
}
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))
}
}