bindgen: everything works

This commit is contained in:
nym21
2026-03-16 11:37:53 +01:00
parent d3721b0020
commit b74319bf10
21 changed files with 189 additions and 96 deletions

View File

@@ -183,6 +183,7 @@ function _wrapMetricData(raw) {{
* @typedef {{Object}} MetricDataBase
* @property {{number}} version - Version of the metric data
* @property {{Index}} index - The index type used for this query
* @property {{string}} type - Value type (e.g. "f32", "u64", "Sats")
* @property {{number}} total - Total number of data points
* @property {{number}} start - Start index (inclusive)
* @property {{number}} end - End index (exclusive)

View File

@@ -24,7 +24,7 @@ pub fn generate_tree_typedefs(output: &mut String, catalog: &TreeNode, metadata:
"MetricsTree",
"",
catalog,
&pattern_lookup,
pattern_lookup,
metadata,
&mut generated,
);
@@ -125,7 +125,7 @@ pub fn generate_main_client(
"MetricsTree",
"",
3,
&pattern_lookup,
pattern_lookup,
metadata,
&mut generated,
);

View File

@@ -220,6 +220,7 @@ class MetricData(Generic[T]):
"""Metric data with range information. Always int-indexed."""
version: int
index: Index
type: str
total: int
start: int
end: int

View File

@@ -21,7 +21,7 @@ pub fn generate_tree_classes(output: &mut String, catalog: &TreeNode, metadata:
"MetricsTree",
"",
catalog,
&pattern_lookup,
pattern_lookup,
metadata,
&mut generated,
);

View File

@@ -4,15 +4,14 @@ use std::fmt::Write;
use crate::{
ClientMetadata, GenericSyntax, IndexSetPattern, RustSyntax, StructuralPattern,
generate_parameterized_field, index_to_field_name, to_snake_case,
escape_rust_keyword, generate_parameterized_field, index_to_field_name, to_snake_case,
};
/// Generate import statements.
pub fn generate_imports(output: &mut String) {
writeln!(
output,
r#"use std::io::Read as _;
use std::sync::Arc;
r#"use std::sync::Arc;
use std::ops::{{Bound, RangeBounds}};
use serde::de::DeserializeOwned;
pub use brk_cohort::*;
@@ -81,40 +80,27 @@ impl BrkClientBase {{
.into();
Self {{
agent,
base_url: options.base_url,
base_url: options.base_url.trim_end_matches('/').to_string(),
}}
}}
fn get(&self, path: &str) -> Result<Vec<u8>> {{
let base = self.base_url.trim_end_matches('/');
let url = format!("{{}}{{}}", base, path);
let mut response = self.agent.get(&url)
.call()
.map_err(|e| BrkError {{ message: e.to_string() }})?;
if response.status().as_u16() >= 400 {{
return Err(BrkError {{
message: format!("HTTP {{}}", response.status().as_u16()),
}});
}}
let mut bytes = Vec::new();
response.body_mut().as_reader().read_to_end(&mut bytes)
.map_err(|e| BrkError {{ message: e.to_string() }})?;
Ok(bytes)
fn url(&self, path: &str) -> String {{
format!("{{}}{{}}", self.base_url, path)
}}
/// Make a GET request and deserialize JSON response.
pub fn get_json<T: DeserializeOwned>(&self, path: &str) -> Result<T> {{
let bytes = self.get(path)?;
serde_json::from_slice(&bytes)
self.agent.get(&self.url(path))
.call()
.and_then(|mut r| r.body_mut().read_json())
.map_err(|e| BrkError {{ message: e.to_string() }})
}}
/// Make a GET request and return raw text response.
pub fn get_text(&self, path: &str) -> Result<String> {{
let bytes = self.get(path)?;
String::from_utf8(bytes)
self.agent.get(&self.url(path))
.call()
.and_then(|mut r| r.body_mut().read_to_string())
.map_err(|e| BrkError {{ message: e.to_string() }})
}}
}}
@@ -525,7 +511,7 @@ pub fn generate_pattern_structs(
writeln!(output, "pub struct {}{} {{", pattern.name, generic_params).unwrap();
for field in &pattern.fields {
let field_name = to_snake_case(&field.name);
let field_name = escape_rust_keyword(&to_snake_case(&field.name));
let type_annotation = metadata.field_type_annotation(
field,
pattern.is_generic,

View File

@@ -7,7 +7,8 @@ use brk_types::TreeNode;
use crate::{
ClientMetadata, GenericSyntax, LanguageSyntax, PatternField, RustSyntax, build_child_path,
generate_leaf_field, generate_tree_node_field, prepare_tree_node, to_snake_case,
escape_rust_keyword, generate_leaf_field, generate_tree_node_field, prepare_tree_node,
to_snake_case,
};
/// Generate tree structs.
@@ -21,7 +22,7 @@ pub fn generate_tree(output: &mut String, catalog: &TreeNode, metadata: &ClientM
"MetricsTree",
"",
catalog,
&pattern_lookup,
pattern_lookup,
metadata,
&mut generated,
);
@@ -45,7 +46,7 @@ fn generate_tree_node(
writeln!(output, "pub struct {} {{", name).unwrap();
for child in &ctx.children {
let field_name = to_snake_case(child.name);
let field_name = escape_rust_keyword(&to_snake_case(child.name));
let type_annotation = if child.should_inline {
child.inline_type_name.clone()
} else {
@@ -67,7 +68,7 @@ fn generate_tree_node(
let syntax = RustSyntax;
for child in &ctx.children {
let field_name = to_snake_case(child.name);
let field_name = escape_rust_keyword(&to_snake_case(child.name));
if child.is_leaf {
if let TreeNode::Leaf(leaf) = child.node {