Module starlark::values::any

source ·
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))
"#,
);

Structs§

  • A type that can be passed around as a Starlark Value, but in most ways is uninteresting/opaque to Starlark. Constructed with new and decomposed with get.