mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-04-25 23:29:58 -07:00
66 lines
2.1 KiB
Rust
66 lines
2.1 KiB
Rust
//! JavaScript client generation.
|
|
//!
|
|
//! This module generates a JavaScript + JSDoc client for the BRK API.
|
|
|
|
mod api;
|
|
mod client;
|
|
mod tree;
|
|
mod types;
|
|
|
|
use std::{fmt::Write, fs, io, path::Path};
|
|
|
|
use serde_json::json;
|
|
|
|
use crate::{ClientMetadata, Endpoint, TypeSchemas, VERSION};
|
|
|
|
/// Generate JavaScript + JSDoc client from metadata and OpenAPI endpoints.
|
|
///
|
|
/// `output_path` is the full path to the output file (e.g., "modules/brk-client/index.js").
|
|
pub fn generate_javascript_client(
|
|
metadata: &ClientMetadata,
|
|
endpoints: &[Endpoint],
|
|
schemas: &TypeSchemas,
|
|
output_path: &Path,
|
|
) -> io::Result<()> {
|
|
let mut output = String::new();
|
|
|
|
writeln!(output, "// Auto-generated BRK JavaScript client").unwrap();
|
|
writeln!(output, "// Do not edit manually\n").unwrap();
|
|
|
|
types::generate_type_definitions(&mut output, schemas);
|
|
client::generate_base_client(&mut output);
|
|
client::generate_index_accessors(&mut output, &metadata.index_set_patterns);
|
|
client::generate_structural_patterns(&mut output, &metadata.structural_patterns, metadata);
|
|
tree::generate_tree_typedefs(&mut output, &metadata.catalog, metadata);
|
|
tree::generate_main_client(&mut output, &metadata.catalog, metadata, endpoints);
|
|
|
|
fs::write(output_path, output)?;
|
|
|
|
// Update package.json version if it exists in the same directory
|
|
if let Some(parent) = output_path.parent() {
|
|
let package_json_path = parent.join("package.json");
|
|
if package_json_path.exists() {
|
|
update_package_json_version(&package_json_path)?;
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn update_package_json_version(package_json_path: &Path) -> io::Result<()> {
|
|
let content = fs::read_to_string(package_json_path)?;
|
|
let mut package: serde_json::Value = serde_json::from_str(&content)
|
|
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
|
|
|
|
if let Some(obj) = package.as_object_mut() {
|
|
obj.insert("version".to_string(), json!(VERSION));
|
|
}
|
|
|
|
let updated = serde_json::to_string_pretty(&package)
|
|
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
|
|
|
|
fs::write(package_json_path, updated + "\n")?;
|
|
|
|
Ok(())
|
|
}
|