Files
perspective-dev--perspective/rust/metadata/main.rs
T
2026-07-13 12:25:07 +08:00

110 lines
5.1 KiB
Rust

// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
#![recursion_limit = "1024"]
//! This module generates metadata for other crates:
//!
//! - `perspective-client`
//! - Add `protobuf-src` dependency
//! - Generate `proto.rs` protobuf client bindings.
//! - `perspective-js`
//! - TypeScript types
//! - Recurisvely set external proto on `perspective-client`
//! - `perspective-server`
//! - Copy `cpp` and `cmake` to local root
//!
//! The `metadata` binary must be run for these assets to be updated in
//! your local dev tree!
use std::error::Error;
use std::fmt::Write;
use std::fs;
use perspective_client::config::*;
use perspective_client::{
ColumnWindow, DeleteOptions, JoinOptions, OnUpdateData, OnUpdateOptions, SystemInfo,
TableInitOptions, UpdateOptions, ViewWindow,
};
use perspective_js::TypedArrayWindow;
use perspective_viewer::config::{PluginStaticConfig, ViewerConfig, ViewerConfigUpdate};
use ts_rs::TS;
pub fn generate_type_bindings_viewer() -> Result<(), Box<dyn Error>> {
let path = std::env::current_dir()?.join("../perspective-viewer/src/ts/ts-rs");
ViewerConfigUpdate::export_all_to(&path)?;
ViewerConfig::<String>::export_all_to(&path)?;
PluginStaticConfig::export_all_to(&path)?;
OnUpdateData::export_all_to(&path)?;
Ok(())
}
fn generate_exprtk_docs() -> Result<(), Box<dyn Error>> {
let mut txt = "<br/>\n\n# Perspective ExprTK Extensions\n\n".to_string();
for rec in perspective_client::config::COMPLETIONS {
writeln!(
txt,
"- `{}` {}",
rec.insert_text,
rec.documentation.replace("\n", " "),
)?;
}
fs::create_dir_all("../perspective-client/docs/")?;
fs::write("../perspective-client/docs/expression_gen.md", txt)?;
Ok(())
}
#[doc(hidden)]
pub fn generate_type_bindings_js() -> Result<(), Box<dyn Error>> {
let path = std::env::current_dir()?.join("../perspective-js/src/ts/ts-rs");
ColumnType::export_all_to(&path)?;
ColumnWindow::export_all_to(&path)?;
DeleteOptions::export_all_to(&path)?;
JoinOptions::export_all_to(&path)?;
OnUpdateData::export_all_to(&path)?;
OnUpdateOptions::export_all_to(&path)?;
SystemInfo::<f64>::export_all_to(&path)?;
TableInitOptions::export_all_to(&path)?;
TypedArrayWindow::export_all_to(&path)?;
UpdateOptions::export_all_to(&path)?;
ViewConfig::export_all_to(&path)?;
ViewConfigUpdate::export_all_to(&path)?;
ViewWindow::export_all_to(&path)?;
ViewWindow::export_all_to(&path)?;
Ok(())
}
#[doc(hidden)]
pub fn generate_python_cargo_licenses() -> Result<(), Box<dyn Error>> {
use std::fs::File;
use std::process::{Command, Stdio};
let python_dir = std::env::current_dir()?.join("../perspective-python");
let bundler = env!("CARGO_BIN_FILE_CARGO_BUNDLE_LICENSES_cargo-bundle-licenses");
let license_file = File::create(python_dir.join("LICENSE_THIRDPARTY_cargo.yml"))?;
Command::new(bundler)
.arg("--format=yaml")
.current_dir(python_dir)
.stdout(Stdio::from(license_file))
.spawn()?
.wait()?;
Ok(())
}
fn main() -> Result<(), Box<dyn Error>> {
generate_type_bindings_js()?;
generate_type_bindings_viewer()?;
generate_exprtk_docs()?;
generate_python_cargo_licenses()?;
Ok(())
}