Skip to content

Commit 705e9a5

Browse files
committed
Fix transpilation
Signed-off-by: Herklos <herklos@drakkar.software>
1 parent a6ab62f commit 705e9a5

213 files changed

Lines changed: 250 additions & 1132 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build/rustTranspiler.ts

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ const MANUALLY_IMPLEMENTED_METHODS = new Set([
4242
'safeBool', 'safeBool2', 'safeBoolN',
4343
'safeDict', 'safeDict2', 'safeDictN',
4444
'safeList', 'safeList2', 'safeListN',
45+
'filterByLimit', 'filterBySinceLimit',
46+
'parseBidAsk', 'parseBidsAsks', 'parseOrderBook',
4547
]);
4648

4749
function isUpperCase(x: string) {
@@ -2497,7 +2499,8 @@ class RustTranspiler {
24972499
return;
24982500
}
24992501

2500-
const generated: string[] = [];
2502+
const alwaysOnExchanges = new Set(['binance']);
2503+
const generated: Array<{ name: string; requiredFeature?: string }> = [];
25012504

25022505
const files = fs
25032506
.readdirSync(tsExamplesFolder)
@@ -2535,7 +2538,7 @@ class RustTranspiler {
25352538
].join('\n');
25362539
overwriteFile(outputPath, placeholder);
25372540
fs.utimesSync(outputPath, new Date(), new Date(inMtime));
2538-
generated.push(outputName);
2541+
generated.push({ name: outputName });
25392542
continue;
25402543
}
25412544
const exchangeId = exchangeMatch[1];
@@ -2553,7 +2556,7 @@ class RustTranspiler {
25532556
].join('\n');
25542557
overwriteFile(outputPath, placeholder);
25552558
fs.utimesSync(outputPath, new Date(), new Date(inMtime));
2556-
generated.push(outputName);
2559+
generated.push({ name: outputName });
25572560
continue;
25582561
}
25592562
let classNameKey = exchangeId;
@@ -2606,7 +2609,8 @@ class RustTranspiler {
26062609
].join('\n');
26072610
overwriteFile(outputPath, placeholder);
26082611
fs.utimesSync(outputPath, new Date(), new Date(inMtime));
2609-
generated.push(outputName);
2612+
const reqFeat0 = isPro ? 'full-pro' : (!alwaysOnExchanges.has(exchangeId) ? 'full-exchanges' : undefined);
2613+
generated.push({ name: outputName, requiredFeature: reqFeat0 });
26102614
continue;
26112615
}
26122616

@@ -2621,6 +2625,12 @@ class RustTranspiler {
26212625
...(FUNCTION_INFO[traitName] || {}),
26222626
...(FUNCTION_INFO[exchangeId] || {}),
26232627
};
2628+
// Filter to only methods that actually exist in the generated Rust trait file
2629+
const rustSource = fs.readFileSync(exchangeModulePath, 'utf8');
2630+
const rustMethodNames = new Set<string>();
2631+
for (const m of rustSource.matchAll(/fn\s+([a-z_][a-z0-9_]*)\s*\(/g)) {
2632+
rustMethodNames.add(m[1]);
2633+
}
26242634
const exampleBody: string[] = [];
26252635
exampleBody.push('// AUTO-GENERATED: transpiled from TypeScript examples/');
26262636
exampleBody.push(`// Source: examples/ts/${file}`);
@@ -2638,11 +2648,11 @@ class RustTranspiler {
26382648
const orderedMethods = Array.from(methodNames).sort();
26392649
for (const method of orderedMethods) {
26402650
const fnInfo = classFns[method];
2641-
if (!fnInfo) {
2651+
const rustName = unCamelCase(method);
2652+
if (!fnInfo || !rustMethodNames.has(rustName)) {
26422653
exampleBody.push(` // skipped: ${method} (not found in transpiled trait)`);
26432654
continue;
26442655
}
2645-
const rustName = unCamelCase(method);
26462656
const args: string[] = [];
26472657
const needsSymbol =
26482658
/^(fetch|watch|create|cancel|edit|parse)/.test(method) ||
@@ -2657,11 +2667,11 @@ class RustTranspiler {
26572667
args.push('Value::Undefined');
26582668
}
26592669
}
2660-
const argsExpr = args.length > 0 ? `, ${args.join(', ')}` : '';
2670+
const argsExpr = args.length > 0 ? args.join(', ') : '';
26612671
if (fnInfo.async) {
2662-
exampleBody.push(` let rv = ${traitName}::${rustName}(&mut exchange${argsExpr}).await;`);
2672+
exampleBody.push(` let rv = exchange.${rustName}(${argsExpr}).await;`);
26632673
} else {
2664-
exampleBody.push(` let rv = ${traitName}::${rustName}(&mut exchange${argsExpr});`);
2674+
exampleBody.push(` let rv = exchange.${rustName}(${argsExpr});`);
26652675
}
26662676
exampleBody.push(
26672677
` println!("${method}: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));`
@@ -2672,7 +2682,8 @@ class RustTranspiler {
26722682
exampleBody.push('');
26732683
overwriteFile(outputPath, exampleBody.join('\n'));
26742684
fs.utimesSync(outputPath, new Date(), new Date(inMtime));
2675-
generated.push(outputName);
2685+
const reqFeat = isPro ? 'full-pro' : (!alwaysOnExchanges.has(exchangeId) ? 'full-exchanges' : undefined);
2686+
generated.push({ name: outputName, requiredFeature: reqFeat });
26762687
}
26772688

26782689
if (generated.length > 0) {
@@ -2681,17 +2692,23 @@ class RustTranspiler {
26812692
}
26822693
}
26832694

2684-
updateCargoExamples(exampleNames: string[]) {
2695+
updateCargoExamples(examples: Array<{ name: string; requiredFeature?: string }>) {
26852696
const cargoPath = './rust/Cargo.toml';
26862697
if (!fs.existsSync(cargoPath)) return;
26872698
const cargo = fs.readFileSync(cargoPath, 'utf8');
26882699
const startMarker = '# AUTO-GENERATED RUST EXAMPLES START';
26892700
const endMarker = '# AUTO-GENERATED RUST EXAMPLES END';
26902701
const block = [
26912702
startMarker,
2692-
...exampleNames
2693-
.sort()
2694-
.map((name) => `[[example]]\nname = "${name}"\npath = "../examples/rust/${name}.rs"`),
2703+
...examples
2704+
.sort((a, b) => a.name.localeCompare(b.name))
2705+
.map((ex) => {
2706+
let entry = `[[example]]\nname = "${ex.name}"\npath = "../examples/rust/${ex.name}.rs"`;
2707+
if (ex.requiredFeature) {
2708+
entry += `\nrequired-features = ["${ex.requiredFeature}"]`;
2709+
}
2710+
return entry;
2711+
}),
26952712
endMarker,
26962713
].join('\n\n');
26972714
const markerRegex = new RegExp(`${startMarker}[\\s\\S]*${endMarker}`, 'm');

examples/rust/build_ohlcv_bars.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,12 @@ async fn main() {
1010
let mut exchange = BinanceImpl::new(Value::Json(json!({})));
1111
let symbol: Value = "OGN/USDT".into();
1212

13-
let rv = Binance::build_ohlcvc(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined);
13+
let rv = exchange.build_ohlcvc(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined);
1414
println!("buildOHLCVC: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
15-
let rv = Binance::fetch_trades(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined).await;
15+
let rv = exchange.fetch_trades(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined).await;
1616
println!("fetchTrades: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
17-
let rv = Binance::filter_by_since_limit(&mut exchange, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined);
18-
println!("filterBySinceLimit: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
17+
// skipped: filterBySinceLimit (not found in transpiled trait)
1918
// skipped: milliseconds (not found in transpiled trait)
20-
let rv = Binance::watch_trades(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined).await;
19+
let rv = exchange.watch_trades(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined).await;
2120
println!("watchTrades: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
2221
}

examples/rust/create_order_position_with_takeprofit_stoploss.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,15 @@ async fn main() {
1111
let symbol: Value = "DOGE/USDT:USDT".into();
1212

1313
// skipped: cancel_order (not found in transpiled trait)
14-
let rv = Okx::create_order(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
14+
let rv = exchange.create_order(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
1515
println!("createOrder: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
16-
let rv = Okx::fetch_open_orders(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined).await;
16+
let rv = exchange.fetch_open_orders(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined).await;
1717
println!("fetchOpenOrders: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
18-
let rv = Okx::fetch_ticker(&mut exchange, symbol.clone(), Value::Undefined).await;
18+
let rv = exchange.fetch_ticker(symbol.clone(), Value::Undefined).await;
1919
println!("fetchTicker: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
20-
let rv = Okx::load_markets(&mut exchange, Value::Undefined, Value::Undefined).await;
21-
println!("loadMarkets: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
22-
let rv = Okx::market(&mut exchange, Value::Undefined);
20+
// skipped: loadMarkets (not found in transpiled trait)
21+
let rv = exchange.market(Value::Undefined);
2322
println!("market: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
24-
let rv = Okx::price_to_precision(&mut exchange, Value::Undefined, Value::Undefined);
23+
let rv = exchange.price_to_precision(Value::Undefined, Value::Undefined);
2524
println!("priceToPrecision: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
2625
}

examples/rust/create_order_ws_example.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ async fn main() {
1010
let mut exchange = BinanceImpl::new(Value::Json(json!({})));
1111
let symbol: Value = "ETH/USDT".into();
1212

13-
let rv = Binance::create_order_ws(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
13+
let rv = exchange.create_order_ws(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
1414
println!("createOrderWs: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
15-
let rv = Binance::load_markets(&mut exchange, Value::Undefined, Value::Undefined).await;
16-
println!("loadMarkets: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
17-
let rv = Binance::set_sandbox_mode(&mut exchange, Value::Undefined);
15+
// skipped: loadMarkets (not found in transpiled trait)
16+
let rv = exchange.set_sandbox_mode(Value::Undefined);
1817
println!("setSandboxMode: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
1918
}

examples/rust/create_orders_example.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ async fn main() {
1010
let mut exchange = BinanceImpl::new(Value::Json(json!({})));
1111
let symbol: Value = "BTC/USDT".into();
1212

13-
let rv = Binance::create_orders(&mut exchange, symbol.clone(), Value::Undefined).await;
13+
let rv = exchange.create_orders(symbol.clone(), Value::Undefined).await;
1414
println!("createOrders: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
15-
let rv = Binance::load_markets(&mut exchange, Value::Undefined, Value::Undefined).await;
16-
println!("loadMarkets: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
17-
let rv = Binance::set_sandbox_mode(&mut exchange, Value::Undefined);
15+
// skipped: loadMarkets (not found in transpiled trait)
16+
let rv = exchange.set_sandbox_mode(Value::Undefined);
1817
println!("setSandboxMode: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
1918
}

examples/rust/create_trailing_amount_order.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ async fn main() {
1010
let mut exchange = BingxImpl::new(Value::Json(json!({})));
1111
let symbol: Value = "BTC/USDT:USDT".into();
1212

13-
let rv = Bingx::create_order(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
13+
let rv = exchange.create_order(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
1414
println!("createOrder: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
15-
let rv = Bingx::create_trailing_amount_order(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
15+
let rv = exchange.create_trailing_amount_order(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
1616
println!("createTrailingAmountOrder: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
17-
let rv = Bingx::load_markets(&mut exchange, Value::Undefined, Value::Undefined).await;
18-
println!("loadMarkets: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
19-
let rv = Bingx::set_sandbox_mode(&mut exchange, Value::Undefined);
17+
// skipped: loadMarkets (not found in transpiled trait)
18+
let rv = exchange.set_sandbox_mode(Value::Undefined);
2019
println!("setSandboxMode: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
2120
}

examples/rust/create_trailing_percent_order.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ async fn main() {
1010
let mut exchange = BingxImpl::new(Value::Json(json!({})));
1111
let symbol: Value = "BTC/USDT:USDT".into();
1212

13-
let rv = Bingx::create_order(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
13+
let rv = exchange.create_order(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
1414
println!("createOrder: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
15-
let rv = Bingx::create_trailing_percent_order(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
15+
let rv = exchange.create_trailing_percent_order(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
1616
println!("createTrailingPercentOrder: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
17-
let rv = Bingx::load_markets(&mut exchange, Value::Undefined, Value::Undefined).await;
18-
println!("loadMarkets: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
19-
let rv = Bingx::set_sandbox_mode(&mut exchange, Value::Undefined);
17+
// skipped: loadMarkets (not found in transpiled trait)
18+
let rv = exchange.set_sandbox_mode(Value::Undefined);
2019
println!("setSandboxMode: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
2120
}

examples/rust/exchange_rate_limiter_rollingwindow.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ async fn main() {
1010
let mut exchange = OkxImpl::new(Value::Json(json!({})));
1111
let symbol: Value = "BTC/USDT".into();
1212

13-
let rv = Okx::fetch_ohlcv(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
13+
let rv = exchange.fetch_ohlcv(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
1414
println!("fetchOHLCV: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
1515
}

examples/rust/fetch_first_ohlcv_timestamp.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ async fn main() {
1111
let symbol: Value = "TRUMP/USDT".into();
1212

1313
// skipped: iso8601 (not found in transpiled trait)
14-
let rv = Binance::load_markets(&mut exchange, Value::Undefined, Value::Undefined).await;
15-
println!("loadMarkets: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
16-
let rv = Binance::market(&mut exchange, Value::Undefined);
14+
// skipped: loadMarkets (not found in transpiled trait)
15+
let rv = exchange.market(Value::Undefined);
1716
println!("market: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
1817
}

examples/rust/fetch_ohlcv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ async fn main() {
1010
let mut exchange = OkxImpl::new(Value::Json(json!({})));
1111
let symbol: Value = "BTC/USDT".into();
1212

13-
let rv = Okx::fetch_ohlcv(&mut exchange, symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
13+
let rv = exchange.fetch_ohlcv(symbol.clone(), Value::Undefined, Value::Undefined, Value::Undefined, Value::Undefined).await;
1414
println!("fetchOHLCV: {}", normalize(&rv).map(|v| v.to_string()).unwrap_or_else(|| "undefined".into()));
1515
// skipped: milliseconds (not found in transpiled trait)
1616
}

0 commit comments

Comments
 (0)