@aztec/bb.js 0.0.1-commit.d3ec352c → 0.0.1-commit.f295ac2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/amd64-linux/bb +0 -0
- package/build/amd64-linux/nodejs_module.node +0 -0
- package/build/amd64-macos/bb +0 -0
- package/build/amd64-macos/nodejs_module.node +0 -0
- package/build/arm64-linux/bb +0 -0
- package/build/arm64-linux/nodejs_module.node +0 -0
- package/build/arm64-macos/bb +0 -0
- package/build/arm64-macos/nodejs_module.node +0 -0
- package/dest/browser/barretenberg/backend.d.ts +48 -17
- package/dest/browser/barretenberg/backend.d.ts.map +1 -1
- package/dest/browser/barretenberg/backend.js +95 -6
- package/dest/browser/barretenberg/index.d.ts +2 -2
- package/dest/browser/barretenberg/index.d.ts.map +1 -1
- package/dest/browser/barretenberg/index.js +2 -2
- package/dest/browser/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg-threads.js +1 -1
- package/dest/browser/barretenberg_wasm/fetch_code/browser/barretenberg.js +1 -1
- package/dest/browser/bb_backends/index.d.ts +3 -1
- package/dest/browser/bb_backends/index.d.ts.map +1 -1
- package/dest/browser/cbind/generate.d.ts +5 -2
- package/dest/browser/cbind/generate.d.ts.map +1 -1
- package/dest/browser/cbind/generate.js +47 -25
- package/dest/browser/cbind/generated/api_types.d.ts +787 -1660
- package/dest/browser/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/browser/cbind/generated/api_types.js +1535 -1535
- package/dest/browser/cbind/generated/async.d.ts +1 -1
- package/dest/browser/cbind/generated/async.d.ts.map +1 -1
- package/dest/browser/cbind/generated/async.js +6 -2
- package/dest/browser/cbind/generated/sync.d.ts +1 -1
- package/dest/browser/cbind/generated/sync.d.ts.map +1 -1
- package/dest/browser/cbind/generated/sync.js +6 -2
- package/dest/browser/cbind/naming.d.ts +16 -0
- package/dest/browser/cbind/naming.d.ts.map +1 -0
- package/dest/browser/cbind/naming.js +24 -0
- package/dest/browser/cbind/rust_codegen.d.ts +25 -0
- package/dest/browser/cbind/rust_codegen.d.ts.map +1 -0
- package/dest/browser/cbind/rust_codegen.js +416 -0
- package/dest/browser/cbind/schema_visitor.d.ts +47 -0
- package/dest/browser/cbind/schema_visitor.d.ts.map +1 -0
- package/dest/browser/cbind/schema_visitor.js +158 -0
- package/dest/browser/cbind/typescript_codegen.d.ts +30 -0
- package/dest/browser/cbind/typescript_codegen.d.ts.map +1 -0
- package/dest/browser/cbind/typescript_codegen.js +365 -0
- package/dest/browser/index.d.ts +2 -2
- package/dest/browser/index.d.ts.map +1 -1
- package/dest/browser/index.js +2 -2
- package/dest/node/barretenberg/backend.d.ts +48 -17
- package/dest/node/barretenberg/backend.d.ts.map +1 -1
- package/dest/node/barretenberg/backend.js +95 -6
- package/dest/node/barretenberg/backend.test.d.ts +2 -0
- package/dest/node/barretenberg/backend.test.d.ts.map +1 -0
- package/dest/node/barretenberg/backend.test.js +103 -0
- package/dest/node/barretenberg/index.d.ts +2 -2
- package/dest/node/barretenberg/index.d.ts.map +1 -1
- package/dest/node/barretenberg/index.js +2 -2
- package/dest/node/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
- package/dest/node/bb_backends/index.d.ts +3 -1
- package/dest/node/bb_backends/index.d.ts.map +1 -1
- package/dest/node/bb_backends/node/index.d.ts +1 -1
- package/dest/node/bb_backends/node/index.d.ts.map +1 -1
- package/dest/node/bb_backends/node/index.js +5 -5
- package/dest/node/bb_backends/node/native_shm.d.ts +3 -2
- package/dest/node/bb_backends/node/native_shm.d.ts.map +1 -1
- package/dest/node/bb_backends/node/native_shm.js +38 -20
- package/dest/node/bb_backends/node/native_shm_async.d.ts +2 -2
- package/dest/node/bb_backends/node/native_shm_async.d.ts.map +1 -1
- package/dest/node/bb_backends/node/native_shm_async.js +15 -20
- package/dest/node/bb_backends/node/native_socket.d.ts +1 -1
- package/dest/node/bb_backends/node/native_socket.d.ts.map +1 -1
- package/dest/node/bb_backends/node/native_socket.js +4 -4
- package/dest/node/bb_backends/node/platform.d.ts +1 -1
- package/dest/node/bb_backends/node/platform.d.ts.map +1 -1
- package/dest/node/bb_backends/node/platform.js +7 -2
- package/dest/node/cbind/generate.d.ts +5 -2
- package/dest/node/cbind/generate.d.ts.map +1 -1
- package/dest/node/cbind/generate.js +47 -25
- package/dest/node/cbind/generated/api_types.d.ts +787 -1660
- package/dest/node/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/node/cbind/generated/api_types.js +1535 -1535
- package/dest/node/cbind/generated/async.d.ts +1 -1
- package/dest/node/cbind/generated/async.d.ts.map +1 -1
- package/dest/node/cbind/generated/async.js +6 -2
- package/dest/node/cbind/generated/sync.d.ts +1 -1
- package/dest/node/cbind/generated/sync.d.ts.map +1 -1
- package/dest/node/cbind/generated/sync.js +6 -2
- package/dest/node/cbind/naming.d.ts +16 -0
- package/dest/node/cbind/naming.d.ts.map +1 -0
- package/dest/node/cbind/naming.js +24 -0
- package/dest/node/cbind/rust_codegen.d.ts +25 -0
- package/dest/node/cbind/rust_codegen.d.ts.map +1 -0
- package/dest/node/cbind/rust_codegen.js +416 -0
- package/dest/node/cbind/schema_visitor.d.ts +47 -0
- package/dest/node/cbind/schema_visitor.d.ts.map +1 -0
- package/dest/node/cbind/schema_visitor.js +158 -0
- package/dest/node/cbind/typescript_codegen.d.ts +30 -0
- package/dest/node/cbind/typescript_codegen.d.ts.map +1 -0
- package/dest/node/cbind/typescript_codegen.js +365 -0
- package/dest/node/index.d.ts +2 -2
- package/dest/node/index.d.ts.map +1 -1
- package/dest/node/index.js +2 -2
- package/dest/node-cjs/barretenberg/backend.d.ts +48 -17
- package/dest/node-cjs/barretenberg/backend.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/backend.js +97 -6
- package/dest/node-cjs/barretenberg/backend.test.d.ts +2 -0
- package/dest/node-cjs/barretenberg/backend.test.d.ts.map +1 -0
- package/dest/node-cjs/barretenberg/backend.test.js +105 -0
- package/dest/node-cjs/barretenberg/index.d.ts +2 -2
- package/dest/node-cjs/barretenberg/index.d.ts.map +1 -1
- package/dest/node-cjs/barretenberg/index.js +4 -2
- package/dest/node-cjs/barretenberg_wasm/barretenberg-threads.wasm.gz +0 -0
- package/dest/node-cjs/barretenberg_wasm/barretenberg_wasm_main/index.js +1 -1
- package/dest/node-cjs/bb_backends/index.d.ts +3 -1
- package/dest/node-cjs/bb_backends/index.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/index.d.ts +1 -1
- package/dest/node-cjs/bb_backends/node/index.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/index.js +5 -5
- package/dest/node-cjs/bb_backends/node/native_shm.d.ts +3 -2
- package/dest/node-cjs/bb_backends/node/native_shm.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/native_shm.js +37 -19
- package/dest/node-cjs/bb_backends/node/native_shm_async.d.ts +2 -2
- package/dest/node-cjs/bb_backends/node/native_shm_async.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/native_shm_async.js +15 -20
- package/dest/node-cjs/bb_backends/node/native_socket.d.ts +1 -1
- package/dest/node-cjs/bb_backends/node/native_socket.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/native_socket.js +4 -4
- package/dest/node-cjs/bb_backends/node/platform.d.ts +1 -1
- package/dest/node-cjs/bb_backends/node/platform.d.ts.map +1 -1
- package/dest/node-cjs/bb_backends/node/platform.js +7 -2
- package/dest/node-cjs/cbind/generate.d.ts +5 -2
- package/dest/node-cjs/cbind/generate.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generate.js +47 -25
- package/dest/node-cjs/cbind/generated/api_types.d.ts +787 -1660
- package/dest/node-cjs/cbind/generated/api_types.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/api_types.js +1744 -1744
- package/dest/node-cjs/cbind/generated/async.d.ts +1 -1
- package/dest/node-cjs/cbind/generated/async.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/async.js +6 -2
- package/dest/node-cjs/cbind/generated/sync.d.ts +1 -1
- package/dest/node-cjs/cbind/generated/sync.d.ts.map +1 -1
- package/dest/node-cjs/cbind/generated/sync.js +6 -2
- package/dest/node-cjs/cbind/naming.d.ts +16 -0
- package/dest/node-cjs/cbind/naming.d.ts.map +1 -0
- package/dest/node-cjs/cbind/naming.js +28 -0
- package/dest/node-cjs/cbind/rust_codegen.d.ts +25 -0
- package/dest/node-cjs/cbind/rust_codegen.d.ts.map +1 -0
- package/dest/node-cjs/cbind/rust_codegen.js +420 -0
- package/dest/node-cjs/cbind/schema_visitor.d.ts +47 -0
- package/dest/node-cjs/cbind/schema_visitor.d.ts.map +1 -0
- package/dest/node-cjs/cbind/schema_visitor.js +162 -0
- package/dest/node-cjs/cbind/typescript_codegen.d.ts +30 -0
- package/dest/node-cjs/cbind/typescript_codegen.d.ts.map +1 -0
- package/dest/node-cjs/cbind/typescript_codegen.js +369 -0
- package/dest/node-cjs/index.d.ts +2 -2
- package/dest/node-cjs/index.d.ts.map +1 -1
- package/dest/node-cjs/index.js +4 -2
- package/package.json +1 -1
- package/src/barretenberg/backend.test.ts +122 -0
- package/src/barretenberg/backend.ts +133 -19
- package/src/barretenberg/index.ts +9 -1
- package/src/barretenberg_wasm/barretenberg_wasm_main/index.ts +1 -1
- package/src/bb_backends/index.ts +3 -0
- package/src/bb_backends/node/index.ts +9 -4
- package/src/bb_backends/node/native_shm.ts +36 -18
- package/src/bb_backends/node/native_shm_async.ts +13 -18
- package/src/bb_backends/node/native_socket.ts +3 -4
- package/src/bb_backends/node/platform.ts +6 -1
- package/src/cbind/generate.ts +51 -32
- package/src/cbind/generated/api_types.ts +1655 -2756
- package/src/cbind/generated/async.ts +7 -2
- package/src/cbind/generated/sync.ts +7 -2
- package/src/cbind/naming.ts +27 -0
- package/src/cbind/rust_codegen.ts +459 -0
- package/src/cbind/schema_visitor.ts +219 -0
- package/src/cbind/typescript_codegen.ts +419 -0
- package/src/index.ts +4 -0
- package/dest/browser/cbind/schema_compiler.d.ts +0 -68
- package/dest/browser/cbind/schema_compiler.d.ts.map +0 -1
- package/dest/browser/cbind/schema_compiler.js +0 -600
- package/dest/node/cbind/schema_compiler.d.ts +0 -68
- package/dest/node/cbind/schema_compiler.d.ts.map +0 -1
- package/dest/node/cbind/schema_compiler.js +0 -600
- package/dest/node-cjs/cbind/schema_compiler.d.ts +0 -68
- package/dest/node-cjs/cbind/schema_compiler.d.ts.map +0 -1
- package/dest/node-cjs/cbind/schema_compiler.js +0 -607
- package/src/cbind/schema_compiler.ts +0 -745
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rust Code Generator - String template based
|
|
3
|
+
*
|
|
4
|
+
* Philosophy:
|
|
5
|
+
* - String templates for file structure
|
|
6
|
+
* - Simple type mapping
|
|
7
|
+
* - Idiomatic Rust conventions
|
|
8
|
+
* - No complex abstraction
|
|
9
|
+
*/
|
|
10
|
+
import { toSnakeCase, toPascalCase } from './naming.js';
|
|
11
|
+
export class RustCodegen {
|
|
12
|
+
// Type mapping: Schema type -> Rust type
|
|
13
|
+
mapType(type) {
|
|
14
|
+
switch (type.kind) {
|
|
15
|
+
case 'primitive':
|
|
16
|
+
switch (type.primitive) {
|
|
17
|
+
case 'bool': return 'bool';
|
|
18
|
+
case 'u8': return 'u8';
|
|
19
|
+
case 'u16': return 'u16';
|
|
20
|
+
case 'u32': return 'u32';
|
|
21
|
+
case 'u64': return 'u64';
|
|
22
|
+
case 'f64': return 'f64';
|
|
23
|
+
case 'string': return 'String';
|
|
24
|
+
case 'bytes': return 'Vec<u8>';
|
|
25
|
+
case 'field2': return '[Vec<u8>; 2]'; // Extension field (Fq2) - pair of 32-byte field elements
|
|
26
|
+
}
|
|
27
|
+
break;
|
|
28
|
+
case 'vector':
|
|
29
|
+
return `Vec<${this.mapType(type.element)}>`;
|
|
30
|
+
case 'array':
|
|
31
|
+
const elemType = this.mapType(type.element);
|
|
32
|
+
// Large arrays become Vec for ergonomics
|
|
33
|
+
return type.size > 32 ? `Vec<${elemType}>` : `[${elemType}; ${type.size}]`;
|
|
34
|
+
case 'optional':
|
|
35
|
+
return `Option<${this.mapType(type.element)}>`;
|
|
36
|
+
case 'struct':
|
|
37
|
+
// Convert struct names to PascalCase for Rust conventions
|
|
38
|
+
return toPascalCase(type.struct.name);
|
|
39
|
+
}
|
|
40
|
+
return 'Unknown';
|
|
41
|
+
}
|
|
42
|
+
// Check if field needs serde(with = "serde_bytes")
|
|
43
|
+
needsSerdeBytes(type) {
|
|
44
|
+
return type.kind === 'primitive' && type.primitive === 'bytes';
|
|
45
|
+
}
|
|
46
|
+
// Check if field needs serde(with = "serde_vec_bytes")
|
|
47
|
+
needsSerdeVecBytes(type) {
|
|
48
|
+
return type.kind === 'vector' && this.needsSerdeBytes(type.element);
|
|
49
|
+
}
|
|
50
|
+
// Generate struct field
|
|
51
|
+
generateField(field) {
|
|
52
|
+
const rustName = toSnakeCase(field.name);
|
|
53
|
+
const rustType = this.mapType(field.type);
|
|
54
|
+
let attrs = '';
|
|
55
|
+
// Add serde rename if needed
|
|
56
|
+
if (field.name !== rustName) {
|
|
57
|
+
attrs += ` #[serde(rename = "${field.name}")]\n`;
|
|
58
|
+
}
|
|
59
|
+
// Add serde bytes handling
|
|
60
|
+
if (this.needsSerdeVecBytes(field.type)) {
|
|
61
|
+
attrs += ` #[serde(with = "serde_vec_bytes")]\n`;
|
|
62
|
+
}
|
|
63
|
+
else if (this.needsSerdeBytes(field.type)) {
|
|
64
|
+
attrs += ` #[serde(with = "serde_bytes")]\n`;
|
|
65
|
+
}
|
|
66
|
+
return `${attrs} pub ${rustName}: ${rustType},`;
|
|
67
|
+
}
|
|
68
|
+
// Generate a struct definition
|
|
69
|
+
generateStruct(struct, isCommand) {
|
|
70
|
+
const rustName = toPascalCase(struct.name);
|
|
71
|
+
const fields = struct.fields.map(f => this.generateField(f)).join('\n');
|
|
72
|
+
// Add serde rename if struct name changed
|
|
73
|
+
const serdeRename = struct.name !== rustName
|
|
74
|
+
? `\n#[serde(rename = "${struct.name}")]`
|
|
75
|
+
: '';
|
|
76
|
+
// Commands need __typename field for struct identification, but skip it during serialization
|
|
77
|
+
const typenameField = isCommand
|
|
78
|
+
? ` #[serde(rename = "__typename", skip_serializing)]\n pub type_name: String,\n`
|
|
79
|
+
: '';
|
|
80
|
+
// Generate constructor for commands
|
|
81
|
+
const constructor = isCommand ? this.generateConstructor(struct, rustName) : '';
|
|
82
|
+
return `/// ${struct.name}
|
|
83
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]${serdeRename}
|
|
84
|
+
pub struct ${rustName} {
|
|
85
|
+
${typenameField}${fields}
|
|
86
|
+
}${constructor}`;
|
|
87
|
+
}
|
|
88
|
+
// Generate constructor for command structs
|
|
89
|
+
generateConstructor(struct, rustName) {
|
|
90
|
+
const params = struct.fields.map(f => `${toSnakeCase(f.name)}: ${this.mapType(f.type)}`).join(', ');
|
|
91
|
+
const fieldInits = [
|
|
92
|
+
` type_name: "${struct.name}".to_string(),`,
|
|
93
|
+
...struct.fields.map(f => ` ${toSnakeCase(f.name)},`),
|
|
94
|
+
].join('\n');
|
|
95
|
+
return `
|
|
96
|
+
|
|
97
|
+
impl ${rustName} {
|
|
98
|
+
pub fn new(${params}) -> Self {
|
|
99
|
+
Self {
|
|
100
|
+
${fieldInits}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}`;
|
|
104
|
+
}
|
|
105
|
+
// Generate Command enum
|
|
106
|
+
generateCommandEnum(schema) {
|
|
107
|
+
const names = Array.from(schema.structs.keys());
|
|
108
|
+
const variants = names
|
|
109
|
+
.map(name => {
|
|
110
|
+
const rustName = toPascalCase(name);
|
|
111
|
+
return ` ${rustName}(${rustName}),`;
|
|
112
|
+
})
|
|
113
|
+
.join('\n');
|
|
114
|
+
const serializeCases = names
|
|
115
|
+
.map(name => {
|
|
116
|
+
const rustName = toPascalCase(name);
|
|
117
|
+
return ` Command::${rustName}(data) => {
|
|
118
|
+
tuple.serialize_element("${name}")?;
|
|
119
|
+
tuple.serialize_element(data)?;
|
|
120
|
+
}`;
|
|
121
|
+
})
|
|
122
|
+
.join('\n');
|
|
123
|
+
const deserializeCases = names
|
|
124
|
+
.map(name => {
|
|
125
|
+
const rustName = toPascalCase(name);
|
|
126
|
+
return ` "${name}" => {
|
|
127
|
+
let data = seq.next_element()?
|
|
128
|
+
.ok_or_else(|| serde::de::Error::invalid_length(1, &self))?;
|
|
129
|
+
Ok(Command::${rustName}(data))
|
|
130
|
+
}`;
|
|
131
|
+
})
|
|
132
|
+
.join('\n');
|
|
133
|
+
const variantNames = names
|
|
134
|
+
.map(name => `"${name}"`)
|
|
135
|
+
.join(', ');
|
|
136
|
+
return `/// Command enum - wraps all possible commands
|
|
137
|
+
#[derive(Debug, Clone)]
|
|
138
|
+
pub enum Command {
|
|
139
|
+
${variants}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
impl Serialize for Command {
|
|
143
|
+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
144
|
+
where S: serde::Serializer {
|
|
145
|
+
use serde::ser::SerializeTuple;
|
|
146
|
+
let mut tuple = serializer.serialize_tuple(2)?;
|
|
147
|
+
match self {
|
|
148
|
+
${serializeCases}
|
|
149
|
+
}
|
|
150
|
+
tuple.end()
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
impl<'de> Deserialize<'de> for Command {
|
|
155
|
+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
156
|
+
where D: serde::Deserializer<'de> {
|
|
157
|
+
use serde::de::{SeqAccess, Visitor};
|
|
158
|
+
struct CommandVisitor;
|
|
159
|
+
|
|
160
|
+
impl<'de> Visitor<'de> for CommandVisitor {
|
|
161
|
+
type Value = Command;
|
|
162
|
+
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
163
|
+
formatter.write_str("a 2-element array [name, payload]")
|
|
164
|
+
}
|
|
165
|
+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
|
166
|
+
where A: SeqAccess<'de> {
|
|
167
|
+
let name: String = seq.next_element()?
|
|
168
|
+
.ok_or_else(|| serde::de::Error::invalid_length(0, &self))?;
|
|
169
|
+
match name.as_str() {
|
|
170
|
+
${deserializeCases}
|
|
171
|
+
_ => Err(serde::de::Error::unknown_variant(&name, &[${variantNames}])),
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
deserializer.deserialize_tuple(2, CommandVisitor)
|
|
176
|
+
}
|
|
177
|
+
}`;
|
|
178
|
+
}
|
|
179
|
+
// Generate Response enum
|
|
180
|
+
generateResponseEnum(schema) {
|
|
181
|
+
// Include all response types from commands plus ErrorResponse if it exists
|
|
182
|
+
const commandResponseTypes = Array.from(new Set(schema.commands.map(c => c.responseType)));
|
|
183
|
+
const responseTypes = schema.responses.has('ErrorResponse')
|
|
184
|
+
? [...commandResponseTypes, 'ErrorResponse']
|
|
185
|
+
: commandResponseTypes;
|
|
186
|
+
const variants = responseTypes
|
|
187
|
+
.map(name => {
|
|
188
|
+
const rustName = toPascalCase(name);
|
|
189
|
+
return ` ${rustName}(${rustName}),`;
|
|
190
|
+
})
|
|
191
|
+
.join('\n');
|
|
192
|
+
const serializeCases = responseTypes
|
|
193
|
+
.map(name => {
|
|
194
|
+
const rustName = toPascalCase(name);
|
|
195
|
+
return ` Response::${rustName}(data) => {
|
|
196
|
+
tuple.serialize_element("${name}")?;
|
|
197
|
+
tuple.serialize_element(data)?;
|
|
198
|
+
}`;
|
|
199
|
+
})
|
|
200
|
+
.join('\n');
|
|
201
|
+
const deserializeCases = responseTypes
|
|
202
|
+
.map(name => {
|
|
203
|
+
const rustName = toPascalCase(name);
|
|
204
|
+
return ` "${name}" => {
|
|
205
|
+
let data = seq.next_element()?
|
|
206
|
+
.ok_or_else(|| serde::de::Error::invalid_length(1, &self))?;
|
|
207
|
+
Ok(Response::${rustName}(data))
|
|
208
|
+
}`;
|
|
209
|
+
})
|
|
210
|
+
.join('\n');
|
|
211
|
+
const variantNames = responseTypes.map(name => `"${name}"`).join(', ');
|
|
212
|
+
return `/// Response enum - wraps all possible responses
|
|
213
|
+
#[derive(Debug, Clone)]
|
|
214
|
+
pub enum Response {
|
|
215
|
+
${variants}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
impl Serialize for Response {
|
|
219
|
+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
220
|
+
where S: serde::Serializer {
|
|
221
|
+
use serde::ser::SerializeTuple;
|
|
222
|
+
let mut tuple = serializer.serialize_tuple(2)?;
|
|
223
|
+
match self {
|
|
224
|
+
${serializeCases}
|
|
225
|
+
}
|
|
226
|
+
tuple.end()
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
impl<'de> Deserialize<'de> for Response {
|
|
231
|
+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
232
|
+
where D: serde::Deserializer<'de> {
|
|
233
|
+
use serde::de::{SeqAccess, Visitor};
|
|
234
|
+
struct ResponseVisitor;
|
|
235
|
+
|
|
236
|
+
impl<'de> Visitor<'de> for ResponseVisitor {
|
|
237
|
+
type Value = Response;
|
|
238
|
+
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
239
|
+
formatter.write_str("a 2-element array [name, payload]")
|
|
240
|
+
}
|
|
241
|
+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
|
242
|
+
where A: SeqAccess<'de> {
|
|
243
|
+
let name: String = seq.next_element()?
|
|
244
|
+
.ok_or_else(|| serde::de::Error::invalid_length(0, &self))?;
|
|
245
|
+
match name.as_str() {
|
|
246
|
+
${deserializeCases}
|
|
247
|
+
_ => Err(serde::de::Error::unknown_variant(&name, &[${variantNames}])),
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
deserializer.deserialize_tuple(2, ResponseVisitor)
|
|
252
|
+
}
|
|
253
|
+
}`;
|
|
254
|
+
}
|
|
255
|
+
// Generate serde helper modules
|
|
256
|
+
generateSerdeHelpers() {
|
|
257
|
+
return `mod serde_bytes {
|
|
258
|
+
use serde::{Deserialize, Deserializer, Serializer};
|
|
259
|
+
pub fn serialize<S>(bytes: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
|
|
260
|
+
where S: Serializer { serializer.serialize_bytes(bytes) }
|
|
261
|
+
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
|
|
262
|
+
where D: Deserializer<'de> { <Vec<u8>>::deserialize(deserializer) }
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
mod serde_vec_bytes {
|
|
266
|
+
use serde::{Deserialize, Deserializer, Serializer, Serialize};
|
|
267
|
+
use serde::ser::SerializeSeq;
|
|
268
|
+
use serde::de::{SeqAccess, Visitor};
|
|
269
|
+
|
|
270
|
+
#[derive(Serialize, Deserialize)]
|
|
271
|
+
struct BytesWrapper(#[serde(with = "super::serde_bytes")] Vec<u8>);
|
|
272
|
+
|
|
273
|
+
pub fn serialize<S>(vec: &Vec<Vec<u8>>, serializer: S) -> Result<S::Ok, S::Error>
|
|
274
|
+
where S: Serializer {
|
|
275
|
+
let mut seq = serializer.serialize_seq(Some(vec.len()))?;
|
|
276
|
+
for bytes in vec {
|
|
277
|
+
seq.serialize_element(&BytesWrapper(bytes.clone()))?;
|
|
278
|
+
}
|
|
279
|
+
seq.end()
|
|
280
|
+
}
|
|
281
|
+
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Vec<u8>>, D::Error>
|
|
282
|
+
where D: Deserializer<'de> {
|
|
283
|
+
struct VecVecU8Visitor;
|
|
284
|
+
impl<'de> Visitor<'de> for VecVecU8Visitor {
|
|
285
|
+
type Value = Vec<Vec<u8>>;
|
|
286
|
+
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
287
|
+
formatter.write_str("a sequence of byte arrays")
|
|
288
|
+
}
|
|
289
|
+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
|
|
290
|
+
where A: SeqAccess<'de> {
|
|
291
|
+
let mut vec = Vec::new();
|
|
292
|
+
while let Some(wrapper) = seq.next_element::<BytesWrapper>()? {
|
|
293
|
+
vec.push(wrapper.0);
|
|
294
|
+
}
|
|
295
|
+
Ok(vec)
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
deserializer.deserialize_seq(VecVecU8Visitor)
|
|
299
|
+
}
|
|
300
|
+
}`;
|
|
301
|
+
}
|
|
302
|
+
// Generate types file
|
|
303
|
+
generateTypes(schema) {
|
|
304
|
+
// Create set of top-level command struct names (only these need __typename)
|
|
305
|
+
const commandNames = new Set(schema.commands.map(c => c.name));
|
|
306
|
+
// Generate all structs (commands first, then responses)
|
|
307
|
+
const commandStructs = Array.from(schema.structs.values())
|
|
308
|
+
.map(s => this.generateStruct(s, commandNames.has(s.name)))
|
|
309
|
+
.join('\n\n');
|
|
310
|
+
const responseStructs = Array.from(schema.responses.values())
|
|
311
|
+
.map(s => this.generateStruct(s, false))
|
|
312
|
+
.join('\n\n');
|
|
313
|
+
return `//! AUTOGENERATED - DO NOT EDIT
|
|
314
|
+
//! Generated from Barretenberg msgpack schema
|
|
315
|
+
|
|
316
|
+
use serde::{Deserialize, Serialize};
|
|
317
|
+
|
|
318
|
+
${this.generateSerdeHelpers()}
|
|
319
|
+
|
|
320
|
+
${commandStructs}
|
|
321
|
+
|
|
322
|
+
${responseStructs}
|
|
323
|
+
|
|
324
|
+
${this.generateCommandEnum(schema)}
|
|
325
|
+
|
|
326
|
+
${this.generateResponseEnum(schema)}
|
|
327
|
+
`;
|
|
328
|
+
}
|
|
329
|
+
// Generate API method
|
|
330
|
+
generateApiMethod(command) {
|
|
331
|
+
const methodName = toSnakeCase(command.name);
|
|
332
|
+
const cmdRustName = toPascalCase(command.name);
|
|
333
|
+
const respRustName = toPascalCase(command.responseType);
|
|
334
|
+
const params = command.fields.map(f => {
|
|
335
|
+
const rustType = this.mapType(f.type);
|
|
336
|
+
// Only convert simple Vec<u8> to &[u8], not nested types
|
|
337
|
+
const apiType = rustType === 'Vec<u8>' ? '&[u8]' : rustType;
|
|
338
|
+
return `${toSnakeCase(f.name)}: ${apiType}`;
|
|
339
|
+
}).join(', ');
|
|
340
|
+
const paramConversions = command.fields.map(f => {
|
|
341
|
+
const name = toSnakeCase(f.name);
|
|
342
|
+
const rustType = this.mapType(f.type);
|
|
343
|
+
// Only convert slices back to Vec
|
|
344
|
+
if (rustType === 'Vec<u8>') {
|
|
345
|
+
return `${name}.to_vec()`;
|
|
346
|
+
}
|
|
347
|
+
return name;
|
|
348
|
+
}).join(', ');
|
|
349
|
+
return ` /// Execute ${command.name} command
|
|
350
|
+
pub fn ${methodName}(&mut self, ${params}) -> Result<${respRustName}> {
|
|
351
|
+
let cmd = Command::${cmdRustName}(${cmdRustName}::new(${paramConversions}));
|
|
352
|
+
match self.execute(cmd)? {
|
|
353
|
+
Response::${respRustName}(resp) => Ok(resp),
|
|
354
|
+
Response::ErrorResponse(err) => Err(BarretenbergError::Backend(
|
|
355
|
+
err.message
|
|
356
|
+
)),
|
|
357
|
+
_ => Err(BarretenbergError::InvalidResponse(
|
|
358
|
+
"Expected ${command.responseType}".to_string()
|
|
359
|
+
)),
|
|
360
|
+
}
|
|
361
|
+
}`;
|
|
362
|
+
}
|
|
363
|
+
// Generate API file
|
|
364
|
+
generateApi(schema) {
|
|
365
|
+
const apiMethods = schema.commands
|
|
366
|
+
.filter(c => c.name !== 'Shutdown')
|
|
367
|
+
.map(c => this.generateApiMethod(c))
|
|
368
|
+
.join('\n\n');
|
|
369
|
+
return `//! AUTOGENERATED - DO NOT EDIT
|
|
370
|
+
//! High-level Barretenberg API - msgpack details hidden
|
|
371
|
+
|
|
372
|
+
use crate::backend::Backend;
|
|
373
|
+
use crate::error::{BarretenbergError, Result};
|
|
374
|
+
use crate::generated_types::*;
|
|
375
|
+
|
|
376
|
+
/// High-level Barretenberg API
|
|
377
|
+
pub struct BarretenbergApi<B: Backend> {
|
|
378
|
+
backend: B,
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
impl<B: Backend> BarretenbergApi<B> {
|
|
382
|
+
/// Create API with custom backend
|
|
383
|
+
pub fn new(backend: B) -> Self {
|
|
384
|
+
Self { backend }
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
fn execute(&mut self, command: Command) -> Result<Response> {
|
|
388
|
+
let input_buffer = rmp_serde::to_vec_named(&vec![command])
|
|
389
|
+
.map_err(|e| BarretenbergError::Serialization(e.to_string()))?;
|
|
390
|
+
|
|
391
|
+
let output_buffer = self.backend.call(&input_buffer)?;
|
|
392
|
+
|
|
393
|
+
let response: Response = rmp_serde::from_slice(&output_buffer)
|
|
394
|
+
.map_err(|e| BarretenbergError::Deserialization(e.to_string()))?;
|
|
395
|
+
|
|
396
|
+
Ok(response)
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
${apiMethods}
|
|
400
|
+
|
|
401
|
+
/// Shutdown backend gracefully
|
|
402
|
+
pub fn shutdown(&mut self) -> Result<()> {
|
|
403
|
+
let cmd = Command::Shutdown(Shutdown::new());
|
|
404
|
+
let _ = self.execute(cmd)?;
|
|
405
|
+
self.backend.destroy()
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/// Destroy backend without shutdown command
|
|
409
|
+
pub fn destroy(&mut self) -> Result<()> {
|
|
410
|
+
self.backend.destroy()
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
`;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdF9jb2RlZ2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NiaW5kL3J1c3RfY29kZWdlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhELE1BQU0sT0FBTyxXQUFXO0lBQ3RCLHlDQUF5QztJQUNqQyxPQUFPLENBQUMsSUFBVSxFQUFVO1FBQ2xDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssV0FBVztnQkFDZCxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxNQUFNLEVBQUUsT0FBTyxNQUFNLENBQUM7b0JBQzNCLEtBQUssSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDO29CQUN2QixLQUFLLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQztvQkFDekIsS0FBSyxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUM7b0JBQ3pCLEtBQUssS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDO29CQUN6QixLQUFLLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQztvQkFDekIsS0FBSyxRQUFRLEVBQUUsT0FBTyxRQUFRLENBQUM7b0JBQy9CLEtBQUssT0FBTyxFQUFFLE9BQU8sU0FBUyxDQUFDO29CQUMvQixLQUFLLFFBQVEsRUFBRSxPQUFPLGNBQWMsQ0FBQyxDQUFFLHlEQUF5RDtnQkFDbEcsQ0FBQztnQkFDRCxNQUFNO1lBRVIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFRLENBQUMsR0FBRyxDQUFDO1lBRS9DLEtBQUssT0FBTztnQkFDVixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFRLENBQUMsQ0FBQztnQkFDN0MseUNBQXlDO2dCQUN6QyxPQUFPLElB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
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Visitor - Minimal abstraction over raw msgpack schema
|
|
3
|
+
*
|
|
4
|
+
* Philosophy:
|
|
5
|
+
* - Keep raw schema structure
|
|
6
|
+
* - Resolve type references into a graph
|
|
7
|
+
* - No normalization - languages handle their own conventions
|
|
8
|
+
* - Output is "compiled schema" with resolved types
|
|
9
|
+
*/
|
|
10
|
+
export type PrimitiveType = 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'f64' | 'string' | 'bytes' | 'field2';
|
|
11
|
+
export interface Type {
|
|
12
|
+
kind: 'primitive' | 'vector' | 'array' | 'optional' | 'struct';
|
|
13
|
+
primitive?: PrimitiveType;
|
|
14
|
+
element?: Type;
|
|
15
|
+
size?: number;
|
|
16
|
+
struct?: Struct;
|
|
17
|
+
}
|
|
18
|
+
export interface Field {
|
|
19
|
+
name: string;
|
|
20
|
+
type: Type;
|
|
21
|
+
}
|
|
22
|
+
export interface Struct {
|
|
23
|
+
name: string;
|
|
24
|
+
fields: Field[];
|
|
25
|
+
}
|
|
26
|
+
export interface Command {
|
|
27
|
+
name: string;
|
|
28
|
+
fields: Field[];
|
|
29
|
+
responseType: string;
|
|
30
|
+
}
|
|
31
|
+
export interface CompiledSchema {
|
|
32
|
+
structs: Map<string, Struct>;
|
|
33
|
+
commands: Command[];
|
|
34
|
+
responses: Map<string, Struct>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* SchemaVisitor - Walks raw msgpack schema and resolves references
|
|
38
|
+
*/
|
|
39
|
+
export declare class SchemaVisitor {
|
|
40
|
+
private structs;
|
|
41
|
+
private responses;
|
|
42
|
+
visit(commandsSchema: any, responsesSchema: any): CompiledSchema;
|
|
43
|
+
private visitStruct;
|
|
44
|
+
private visitType;
|
|
45
|
+
private resolvePrimitive;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hX3Zpc2l0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYmluZC9zY2hlbWFfdmlzaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sTUFBTSxhQUFhLEdBQUcsTUFBTSxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsUUFBUSxHQUFHLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFFMUcsTUFBTSxXQUFXLElBQUk7SUFDbkIsSUFBSSxFQUFFLFdBQVcsR0FBRyxRQUFRLEdBQUcsT0FBTyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUM7SUFDL0QsU0FBUyxDQUFDLEVBQUUsYUFBYSxDQUFDO0lBQzFCLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNmLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNkLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNqQjtBQUVELE1BQU0sV0FBVyxLQUFLO0lBQ3BCLElBQUksRUFBRSxNQUFNLENBQUM7SUFDYixJQUFJLEVBQUUsSUFBSSxDQUFDO0NBQ1o7QUFFRCxNQUFNLFdBQVcsTUFBTTtJQUNyQixJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0NBQ2pCO0FBRUQsTUFBTSxXQUFXLE9BQU87SUFDdEIsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUNiLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNoQixZQUFZLEVBQUUsTUFBTSxDQUFDO0NBQ3RCO0FBRUQsTUFBTSxXQUFXLGNBQWM7SUFFN0IsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFHN0IsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBR3BCLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQ2hDO0FBRUQ7O0dBRUc7QUFDSCxxQkFBYSxhQUFhO0lBQ3hCLE9BQU8sQ0FBQyxPQUFPLENBQTZCO0lBQzVDLE9BQU8sQ0FBQyxTQUFTLENBQTZCO0lBRTlDLEtBQUssQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxHQUFHLEdBQUcsY0FBYyxDQTJDL0Q7SUFFRCxPQUFPLENBQUMsV0FBVztJQWdCbkIsT0FBTyxDQUFDLFNBQVM7SUE2RWpCLE9BQU8sQ0FBQyxnQkFBZ0I7Q0EwQnpCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema_visitor.d.ts","sourceRoot":"","sources":["../../../src/cbind/schema_visitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1G,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC/D,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAE7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG7B,QAAQ,EAAE,OAAO,EAAE,CAAC;IAGpB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAA6B;IAE9C,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,GAAG,cAAc,CA2C/D;IAED,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,SAAS;IA6EjB,OAAO,CAAC,gBAAgB;CA0BzB"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Visitor - Minimal abstraction over raw msgpack schema
|
|
3
|
+
*
|
|
4
|
+
* Philosophy:
|
|
5
|
+
* - Keep raw schema structure
|
|
6
|
+
* - Resolve type references into a graph
|
|
7
|
+
* - No normalization - languages handle their own conventions
|
|
8
|
+
* - Output is "compiled schema" with resolved types
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* SchemaVisitor - Walks raw msgpack schema and resolves references
|
|
12
|
+
*/
|
|
13
|
+
export class SchemaVisitor {
|
|
14
|
+
structs = new Map();
|
|
15
|
+
responses = new Map();
|
|
16
|
+
visit(commandsSchema, responsesSchema) {
|
|
17
|
+
// Reset state
|
|
18
|
+
this.structs.clear();
|
|
19
|
+
this.responses.clear();
|
|
20
|
+
const commands = [];
|
|
21
|
+
// Schema format: ["named_union", [[name, schema], ...]]
|
|
22
|
+
const commandPairs = commandsSchema[1];
|
|
23
|
+
const responsePairs = responsesSchema[1];
|
|
24
|
+
// First, visit all response types (including ErrorResponse)
|
|
25
|
+
for (const [respName, respSchema] of responsePairs) {
|
|
26
|
+
if (typeof respSchema !== 'string') {
|
|
27
|
+
const respStruct = this.visitStruct(respName, respSchema);
|
|
28
|
+
this.responses.set(respName, respStruct);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Visit all commands and pair with responses
|
|
32
|
+
for (let i = 0; i < commandPairs.length; i++) {
|
|
33
|
+
const [cmdName, cmdSchema] = commandPairs[i];
|
|
34
|
+
// Find matching response (skip ErrorResponse which is always last)
|
|
35
|
+
const normalResponses = responsePairs.filter(([name]) => name !== 'ErrorResponse');
|
|
36
|
+
const [respName] = normalResponses[i];
|
|
37
|
+
// Discover command structure
|
|
38
|
+
const cmdStruct = this.visitStruct(cmdName, cmdSchema);
|
|
39
|
+
this.structs.set(cmdName, cmdStruct);
|
|
40
|
+
// Create command mapping
|
|
41
|
+
commands.push({
|
|
42
|
+
name: cmdName,
|
|
43
|
+
fields: cmdStruct.fields,
|
|
44
|
+
responseType: respName,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
structs: this.structs,
|
|
49
|
+
commands,
|
|
50
|
+
responses: this.responses,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
visitStruct(name, schema) {
|
|
54
|
+
const fields = [];
|
|
55
|
+
// Schema is an object with __typename and fields
|
|
56
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
57
|
+
if (key === '__typename')
|
|
58
|
+
continue;
|
|
59
|
+
fields.push({
|
|
60
|
+
name: key,
|
|
61
|
+
type: this.visitType(value),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return { name, fields };
|
|
65
|
+
}
|
|
66
|
+
visitType(schema) {
|
|
67
|
+
// Primitive string type
|
|
68
|
+
if (typeof schema === 'string') {
|
|
69
|
+
return this.resolvePrimitive(schema);
|
|
70
|
+
}
|
|
71
|
+
// Array type descriptor: ['vector', [elementType]]
|
|
72
|
+
if (Array.isArray(schema)) {
|
|
73
|
+
const [kind, args] = schema;
|
|
74
|
+
switch (kind) {
|
|
75
|
+
case 'vector': {
|
|
76
|
+
const [elemType] = args;
|
|
77
|
+
// Special case: vector<unsigned char> = bytes
|
|
78
|
+
if (elemType === 'unsigned char') {
|
|
79
|
+
return { kind: 'primitive', primitive: 'bytes' };
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
kind: 'vector',
|
|
83
|
+
element: this.visitType(elemType),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
case 'array': {
|
|
87
|
+
const [elemType, size] = args;
|
|
88
|
+
// Special case: array<unsigned char, N> = bytes
|
|
89
|
+
if (elemType === 'unsigned char') {
|
|
90
|
+
return { kind: 'primitive', primitive: 'bytes' };
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
kind: 'array',
|
|
94
|
+
element: this.visitType(elemType),
|
|
95
|
+
size,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
case 'optional': {
|
|
99
|
+
const [elemType] = args;
|
|
100
|
+
return {
|
|
101
|
+
kind: 'optional',
|
|
102
|
+
element: this.visitType(elemType),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
case 'shared_ptr': {
|
|
106
|
+
// Dereference shared_ptr - just use inner type
|
|
107
|
+
const [innerType] = args;
|
|
108
|
+
return this.visitType(innerType);
|
|
109
|
+
}
|
|
110
|
+
case 'alias': {
|
|
111
|
+
// Alias types (like uint256_t) are treated as bytes
|
|
112
|
+
return { kind: 'primitive', primitive: 'bytes' };
|
|
113
|
+
}
|
|
114
|
+
default:
|
|
115
|
+
throw new Error(`Unknown type kind: ${kind}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Inline struct definition
|
|
119
|
+
if (typeof schema === 'object' && schema.__typename) {
|
|
120
|
+
const structName = schema.__typename;
|
|
121
|
+
// Check if already visited
|
|
122
|
+
if (!this.structs.has(structName)) {
|
|
123
|
+
const struct = this.visitStruct(structName, schema);
|
|
124
|
+
this.structs.set(structName, struct);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
kind: 'struct',
|
|
128
|
+
struct: this.structs.get(structName),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`Cannot resolve type: ${JSON.stringify(schema)}`);
|
|
132
|
+
}
|
|
133
|
+
resolvePrimitive(name) {
|
|
134
|
+
const primitiveMap = {
|
|
135
|
+
'bool': 'bool',
|
|
136
|
+
'int': 'u32',
|
|
137
|
+
'unsigned int': 'u32',
|
|
138
|
+
'unsigned short': 'u16',
|
|
139
|
+
'unsigned long': 'u64',
|
|
140
|
+
'unsigned char': 'u8',
|
|
141
|
+
'double': 'f64',
|
|
142
|
+
'string': 'string',
|
|
143
|
+
'bin32': 'bytes',
|
|
144
|
+
'field2': 'field2', // Extension field (Fq2) - pair of field elements
|
|
145
|
+
};
|
|
146
|
+
const primitive = primitiveMap[name];
|
|
147
|
+
if (primitive) {
|
|
148
|
+
return { kind: 'primitive', primitive };
|
|
149
|
+
}
|
|
150
|
+
// Unknown primitive - treat as struct reference
|
|
151
|
+
// This will be resolved later if it's a real struct
|
|
152
|
+
return {
|
|
153
|
+
kind: 'struct',
|
|
154
|
+
struct: { name, fields: [] }, // Placeholder
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hX3Zpc2l0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2JpbmQvc2NoZW1hX3Zpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUF1Q0g7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQUNoQixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDcEMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRTlDLEtBQUssQ0FBQyxjQUFtQixFQUFFLGVBQW9CLEVBQWtCO1FBQy9ELGNBQWM7UUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdkIsTUFBTSxRQUFRLEdBQWMsRUFBRSxDQUFDO1FBRS9CLHdEQUF3RDtRQUN4RCxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUF5QixDQUFDO1FBQy9ELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQXlCLENBQUM7UUFFakUsNERBQTREO1FBQzVELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNuRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFD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
|