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}