Skip to main content

cynos_database/
lib.rs

1//! Cynos API - WASM bindings and JavaScript API for Cynos database.
2//!
3//! This crate provides the public API for the Cynos in-memory database,
4//! including WASM bindings for use in JavaScript/TypeScript applications.
5//!
6//! # Core Components
7//!
8//! - `Database`: Main entry point for database operations
9//! - `TableBuilder`: Builder for creating table schemas
10//! - `SelectBuilder`: Query builder for SELECT statements
11//! - `InsertBuilder`, `UpdateBuilder`, `DeleteBuilder`: DML builders
12//! - `JsObservableQuery`: Observable query with subscription support
13//!
14//! # Example (JavaScript)
15//!
16//! ```javascript
17//! import { Database, DataType, col } from 'cynos';
18//!
19//! const db = await Database.create('mydb');
20//!
21//! db.createTable('users')
22//!   .column('id', DataType.Int64, { primaryKey: true })
23//!   .column('name', DataType.String)
24//!   .column('age', DataType.Int32)
25//!   .build();
26//!
27//! await db.insert('users').values([
28//!   { id: 1, name: 'Alice', age: 25 },
29//!   { id: 2, name: 'Bob', age: 30 },
30//! ]).exec();
31//!
32//! const results = await db.select()
33//!   .from('users')
34//!   .where(col('age').gt(25))
35//!   .exec();
36//! ```
37
38extern crate alloc;
39
40pub mod convert;
41pub mod database;
42pub mod expr;
43pub mod query_builder;
44pub mod query_engine;
45pub mod reactive_bridge;
46pub mod table;
47pub mod transaction;
48pub mod binary_protocol;
49
50pub use convert::{js_to_row, js_to_value, row_to_js, value_to_js};
51pub use database::Database;
52pub use expr::{Column, Expr};
53pub use query_builder::{DeleteBuilder, InsertBuilder, SelectBuilder, UpdateBuilder};
54pub use reactive_bridge::{JsChangesStream, JsObservableQuery};
55pub use table::{JsTable, JsTableBuilder};
56pub use transaction::JsTransaction;
57pub use binary_protocol::{BinaryResult, SchemaLayout};
58
59use wasm_bindgen::prelude::*;
60
61/// Initialize the WASM module.
62#[wasm_bindgen(start)]
63pub fn init() {
64    // Panic hook initialization removed - feature not configured
65}
66
67/// Data types supported by Cynos.
68#[wasm_bindgen]
69#[derive(Clone, Copy, Debug, PartialEq, Eq)]
70pub enum JsDataType {
71    Boolean = 0,
72    Int32 = 1,
73    Int64 = 2,
74    Float64 = 3,
75    String = 4,
76    DateTime = 5,
77    Bytes = 6,
78    Jsonb = 7,
79}
80
81impl From<JsDataType> for cynos_core::DataType {
82    fn from(dt: JsDataType) -> Self {
83        match dt {
84            JsDataType::Boolean => cynos_core::DataType::Boolean,
85            JsDataType::Int32 => cynos_core::DataType::Int32,
86            JsDataType::Int64 => cynos_core::DataType::Int64,
87            JsDataType::Float64 => cynos_core::DataType::Float64,
88            JsDataType::String => cynos_core::DataType::String,
89            JsDataType::DateTime => cynos_core::DataType::DateTime,
90            JsDataType::Bytes => cynos_core::DataType::Bytes,
91            JsDataType::Jsonb => cynos_core::DataType::Jsonb,
92        }
93    }
94}
95
96impl From<cynos_core::DataType> for JsDataType {
97    fn from(dt: cynos_core::DataType) -> Self {
98        match dt {
99            cynos_core::DataType::Boolean => JsDataType::Boolean,
100            cynos_core::DataType::Int32 => JsDataType::Int32,
101            cynos_core::DataType::Int64 => JsDataType::Int64,
102            cynos_core::DataType::Float64 => JsDataType::Float64,
103            cynos_core::DataType::String => JsDataType::String,
104            cynos_core::DataType::DateTime => JsDataType::DateTime,
105            cynos_core::DataType::Bytes => JsDataType::Bytes,
106            cynos_core::DataType::Jsonb => JsDataType::Jsonb,
107        }
108    }
109}
110
111/// Sort order for ORDER BY clauses.
112#[wasm_bindgen]
113#[derive(Clone, Copy, Debug, PartialEq, Eq)]
114pub enum JsSortOrder {
115    Asc = 0,
116    Desc = 1,
117}
118
119impl From<JsSortOrder> for cynos_query::ast::SortOrder {
120    fn from(order: JsSortOrder) -> Self {
121        match order {
122            JsSortOrder::Asc => cynos_query::ast::SortOrder::Asc,
123            JsSortOrder::Desc => cynos_query::ast::SortOrder::Desc,
124        }
125    }
126}
127
128/// Helper function to create a column reference.
129#[wasm_bindgen]
130pub fn col(name: &str) -> Column {
131    Column::new_simple(name)
132}