in starlark/src/stdlib/funcs.rs [351:378]
fn float(ref a: Option<Value>) -> anyhow::Result<f64> {
if a.is_none() {
return Ok(0.0);
}
let a = a.unwrap();
if let Some(f) = a.unpack_num().map(|n| n.as_float()) {
Ok(f)
} else if let Some(s) = a.unpack_str() {
match s.parse::<f64>() {
Ok(f) => {
if f.is_infinite() && !s.to_lowercase().contains("inf") {
// if a resulting float is infinite but the parsed string is not explicitly infinity then we should fail with an error
Err(anyhow!("float() floating-point number too large: {}", s))
} else {
Ok(f)
}
}
Err(x) => Err(anyhow!("{} is not a valid number: {}", a.to_repr(), x)),
}
} else if let Some(b) = a.unpack_bool() {
Ok(if b { 1.0 } else { 0.0 })
} else {
Err(anyhow!(
"float() argument must be a string, a number, or a boolean, not `{}`",
a.get_type()
))
}
}