Port random integer & decimal to engine-p + related refactoring (#3393)

* Implement minmax for Range; Simplify range command

* Port random integer to enginep; New FromValue impl

Now, FromValue is implemented for Tagged<Range> to allow extracting args
into this type.

* Make sure range value extraction fails properly

The range endpoint extraction methods now return error instead of
silently clipping the value. This now makes `random integer ..-4` fail
properly since -4 can't be cast as u64.

* Port random decimal to enginep & Refactor

This added a way to interpret Range limits as f64 and a Primitive helper
to get its value as f64.

A side effect of this commit is that it is now possible to specify the
command bounds as true decimals. E.g., `random decimal 0.0..3.14` does
not clip 3.14 to 3.
This commit is contained in:
Jakub Žádník
2021-05-07 22:58:12 +03:00
committed by GitHub
parent 91a929b2a9
commit 9fd6923821
6 changed files with 170 additions and 61 deletions

View File

@ -267,6 +267,22 @@ impl FromValue for Range {
}
}
impl FromValue for Tagged<Range> {
fn from_value(v: &Value) -> Result<Self, ShellError> {
let tag = v.tag.clone();
match v.value {
UntaggedValue::Primitive(Primitive::Range(ref range)) => {
Ok((*range.clone()).tagged(tag))
}
_ => Err(ShellError::labeled_error(
"Can't convert to range",
"can't convert to range",
tag.span,
)),
}
}
}
impl FromValue for Vec<u8> {
fn from_value(v: &Value) -> Result<Self, ShellError> {
match v {