in starlark/src/values/types/range.rs [213:245]
fn is_in(&self, other: Value) -> anyhow::Result<bool> {
let other = match other.unpack_num().and_then(|n| n.as_int()) {
Some(other) => other,
None => {
// Consider `"a" in range(3)`
//
// Should we error or return false?
// Go Starlark errors. Python returns false.
// Discussion at https://github.com/bazelbuild/starlark/issues/175
return Ok(false);
}
};
if !self.to_bool() {
return Ok(false);
}
if self.start == other {
return Ok(true);
}
if self.step.get() > 0 {
if other < self.start || other >= self.stop {
return Ok(false);
}
Ok((other.wrapping_sub(self.start) as u64) % (self.step.get() as u64) == 0)
} else {
if other > self.start || other <= self.stop {
return Ok(false);
}
Ok(
(self.start.wrapping_sub(other) as u64) % (self.step.get().wrapping_neg() as u64)
== 0,
)
}
}