#[js(get_index)]
, #[js(set_index)]
Use #[js(get_index)]
and #[js(set_index)]
for dynamic property access and update
(i.e. the obj[prop]
bracket notation).
use ferrosaur::js;
#[path = "../../../crates/ferrosaur/tests/fixture/mod.rs"]
mod fixture;
#[js(value)]
struct Record;
#[js(interface)]
impl Record {
#[js(get_index)]
fn get(&self, k: serde<&str>) -> String {}
#[js(set_index)]
fn set(&self, k: serde<&str>, v: serde<&str>) {}
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let rt = &mut fixture::deno()?;
// let rt: &mut JsRuntime;
let record: Record = fixture::eval_value("({})", rt)?;
// let record: Record;
let key = "foo";
record.set(key, "bar", rt)?;
assert_eq!(record.get(key, rt)?, "bar");
Ok(())
}
// Expressed in TypeScript:
declare const record: Record<string, string>;
const key = "foo";
record[key] = "bar";
assert(record[key] === "bar");
Functions decorated with js(get_index)
must have 2 arguments: &self
and the key to
get, as well as a return type: the type of the value.
Functions decorated with js(set_index)
must have 3 arguments: &self
, the key, and
the value to set.
Argument types must implement either ToV8
(the default) or Serialize
(if written
as serde<T>
). The return type must implement either FromV8
or
DeserializeOwned
.
note
See Specifying types for more info on how you can specify types when using this crate.