mirror of
https://github.com/ahgamut/rust-ape-example.git
synced 2024-05-15 10:02:42 +00:00
67 lines
1.5 KiB
Rust
67 lines
1.5 KiB
Rust
// ./src/std/result.md
|
|
|
|
|
|
mod checked {
|
|
// Mathematical "errors" we want to catch
|
|
#[derive(Debug)]
|
|
pub enum MathError {
|
|
DivisionByZero,
|
|
NonPositiveLogarithm,
|
|
NegativeSquareRoot,
|
|
}
|
|
|
|
pub type MathResult = Result<f64, MathError>;
|
|
|
|
pub fn div(x: f64, y: f64) -> MathResult {
|
|
if y == 0.0 {
|
|
// This operation would `fail`, instead let's return the reason of
|
|
// the failure wrapped in `Err`
|
|
Err(MathError::DivisionByZero)
|
|
} else {
|
|
// This operation is valid, return the result wrapped in `Ok`
|
|
Ok(x / y)
|
|
}
|
|
}
|
|
|
|
pub fn sqrt(x: f64) -> MathResult {
|
|
if x < 0.0 {
|
|
Err(MathError::NegativeSquareRoot)
|
|
} else {
|
|
Ok(x.sqrt())
|
|
}
|
|
}
|
|
|
|
pub fn ln(x: f64) -> MathResult {
|
|
if x <= 0.0 {
|
|
Err(MathError::NonPositiveLogarithm)
|
|
} else {
|
|
Ok(x.ln())
|
|
}
|
|
}
|
|
}
|
|
|
|
// `op(x, y)` === `sqrt(ln(x / y))`
|
|
fn op(x: f64, y: f64) -> f64 {
|
|
// This is a three level match pyramid!
|
|
match checked::div(x, y) {
|
|
Err(why) => panic!("{:?}", why),
|
|
Ok(ratio) => match checked::ln(ratio) {
|
|
Err(why) => panic!("{:?}", why),
|
|
Ok(ln) => match checked::sqrt(ln) {
|
|
Err(why) => panic!("{:?}", why),
|
|
Ok(sqrt) => sqrt,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
fn part0() {
|
|
// Will this fail?
|
|
println!("{}", op(1.0, 10.0));
|
|
}
|
|
|
|
pub fn main() {
|
|
part0();
|
|
}
|
|
|