Expand description
A type StarlarkAny
which can cheaply wrap any Rust value into a Value
.
This is intended to be a low cost way to quickly wrap Rust types without much boilerplate.
For more advanced uses you should define an instance of StarlarkValue
.
To use this type, usually you will return a StarlarkAny
from a module function,
and consume it in another. As an example, we can cheaply wrap the
Duration
type.
#[macro_use]
extern crate starlark;
use std::fmt;
use std::fmt::Display;
use std::time::Instant;
use starlark::assert::Assert;
use starlark::environment::GlobalsBuilder;
use starlark::values::any::StarlarkAny;
use starlark::values::Value;
#[derive(Debug)]
struct MyInstant(Instant);
impl Display for MyInstant {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self)
}
}
#[starlark_module]
fn globals(builder: &mut GlobalsBuilder) {
fn start() -> anyhow::Result<StarlarkAny<MyInstant>> {
Ok(StarlarkAny::new(MyInstant(Instant::now())))
}
fn elapsed(x: Value) -> anyhow::Result<String> {
Ok(StarlarkAny::<MyInstant>::get(x)
.unwrap()
.0
.elapsed()
.as_secs_f64()
.to_string())
}
}
let mut a = Assert::new();
a.globals_add(globals);
a.pass(
r#"
duration = start()
y = 100
for x in range(100):
y += x
print(elapsed(duration))
"#,
);