Skip to main content

kimchi_napi/
tables.rs

1use arkworks::{WasmPastaFp, WasmPastaFq};
2use kimchi::circuits::lookup::{runtime_tables::RuntimeTableCfg, tables::LookupTable};
3use mina_curves::pasta::{Fp, Fq};
4use napi::bindgen_prelude::Uint8Array;
5use napi_derive::napi;
6use wasm_types::FlatVector;
7
8fn bytes_to_fp_vec(bytes: Vec<u8>) -> Vec<Fp> {
9    FlatVector::<WasmPastaFp>::from_bytes(bytes)
10        .into_iter()
11        .map(Into::into)
12        .collect()
13}
14
15fn bytes_to_fq_vec(bytes: Vec<u8>) -> Vec<Fq> {
16    FlatVector::<WasmPastaFq>::from_bytes(bytes)
17        .into_iter()
18        .map(Into::into)
19        .collect()
20}
21
22fn typed_array_to_vec(array: &Uint8Array) -> Vec<u8> {
23    array.to_vec()
24}
25
26#[napi(object)]
27pub struct JsLookupTableFp {
28    pub id: i32,
29    pub data: Vec<Uint8Array>,
30}
31
32#[napi(object)]
33pub struct JsLookupTableFq {
34    pub id: i32,
35    pub data: Vec<Uint8Array>,
36}
37
38#[napi(object)]
39pub struct JsRuntimeTableCfgFp {
40    pub id: i32,
41    pub first_column: Uint8Array,
42}
43
44#[napi(object)]
45pub struct JsRuntimeTableCfgFq {
46    pub id: i32,
47    pub first_column: Uint8Array,
48}
49
50pub fn lookup_table_fp_from_js(js: JsLookupTableFp) -> napi::Result<LookupTable<Fp>> {
51    let mut data = Vec::with_capacity(js.data.len());
52    for column in js.data {
53        data.push(bytes_to_fp_vec(typed_array_to_vec(&column)));
54    }
55    Ok(LookupTable { id: js.id, data })
56}
57
58pub fn lookup_table_fq_from_js(js: JsLookupTableFq) -> napi::Result<LookupTable<Fq>> {
59    let mut data = Vec::with_capacity(js.data.len());
60    for column in js.data {
61        data.push(bytes_to_fq_vec(typed_array_to_vec(&column)));
62    }
63    Ok(LookupTable { id: js.id, data })
64}
65
66pub fn runtime_table_cfg_fp_from_js(js: JsRuntimeTableCfgFp) -> napi::Result<RuntimeTableCfg<Fp>> {
67    Ok(RuntimeTableCfg {
68        id: js.id,
69        first_column: bytes_to_fp_vec(typed_array_to_vec(&js.first_column)),
70    })
71}
72
73pub fn runtime_table_cfg_fq_from_js(js: JsRuntimeTableCfgFq) -> napi::Result<RuntimeTableCfg<Fq>> {
74    Ok(RuntimeTableCfg {
75        id: js.id,
76        first_column: bytes_to_fq_vec(typed_array_to_vec(&js.first_column)),
77    })
78}