shape_viz_core/lib.rs
1//! # Shape Viz Core
2//!
3//! High-performance GPU-accelerated charting library with modular layer architecture.
4//!
5//! ## Architecture Overview
6//!
7//! Shape Viz Core is built around a modular layer system where each visual component
8//! (range bars, grid, axes, indicators) is implemented as a separate layer that
9//! can be composed together to create complex charts.
10//!
11//! ### Core Components
12//!
13//! - **Renderer**: GPU-accelerated rendering engine using WGPU
14//! - **Layers**: Modular rendering components (range bars, grid, axes, etc.)
15//! - **Viewport**: Coordinate system and transformation management
16//! - **Data**: Efficient data structures for generic time series
17//! - **Themes**: Professional styling and color schemes
18//!
19//! ## Example Usage
20//!
21//! ```rust,no_run
22//! use shape_viz_core::{Chart, ChartConfig, ChartData, Series};
23//! use shape_viz_core::layers::{CandlestickLayer, GridLayer, PriceAxisLayer};
24//! use std::any::Any;
25//!
26//! #[derive(Debug)]
27//! struct SimpleSeries {
28//! name: String,
29//! x: Vec<f64>,
30//! y: Vec<f64>,
31//! }
32//!
33//! impl Series for SimpleSeries {
34//! fn name(&self) -> &str { &self.name }
35//! fn len(&self) -> usize { self.x.len() }
36//! fn get_x(&self, index: usize) -> f64 { self.x[index] }
37//! fn get_y(&self, index: usize) -> f64 { self.y[index] }
38//! fn get_x_range(&self) -> (f64, f64) {
39//! (*self.x.first().unwrap(), *self.x.last().unwrap())
40//! }
41//! fn get_y_range(&self, _x_min: f64, _x_max: f64) -> (f64, f64) {
42//! let min = self.y.iter().cloned().fold(f64::INFINITY, f64::min);
43//! let max = self.y.iter().cloned().fold(f64::NEG_INFINITY, f64::max);
44//! (min, max)
45//! }
46//! fn find_index(&self, x: f64) -> Option<usize> {
47//! self.x.iter().position(|v| *v == x)
48//! }
49//! fn as_any(&self) -> &dyn Any { self }
50//! }
51//!
52//! let config = ChartConfig::default();
53//! let mut chart = pollster::block_on(Chart::new(config))?;
54//!
55//! // Add layers
56//! chart.add_layer(Box::new(GridLayer::new()));
57//! chart.add_layer(Box::new(CandlestickLayer::new()));
58//! chart.add_layer(Box::new(PriceAxisLayer::new()));
59//!
60//! // Attach data
61//! let series = SimpleSeries {
62//! name: "demo".to_string(),
63//! x: vec![1.0, 2.0, 3.0],
64//! y: vec![10.0, 12.0, 11.0],
65//! };
66//! chart.set_data(ChartData::new(Box::new(series)))?;
67//!
68//! // Render frame
69//! let image_data = pollster::block_on(chart.render())?;
70//! # let _ = image_data;
71//! # Ok::<(), Box<dyn std::error::Error>>(())
72//! ```
73
74pub mod chart;
75pub mod data;
76pub mod error;
77pub mod event;
78pub mod layers;
79pub mod renderer;
80pub mod style;
81pub mod theme;
82pub mod utils;
83pub mod viewport;
84pub mod wire;
85
86#[cfg(feature = "text-rendering")]
87pub mod text_gpu;
88#[cfg(feature = "text-rendering")]
89pub use text_gpu as text;
90
91// Re-export commonly used types
92pub use chart::{Chart, ChartConfig};
93pub use data::{ChartData, RangeSeries, Series, TimeRange};
94pub use error::{ChartError, Result};
95pub use event::{ChartEvent, ChartState};
96pub use glam::Vec2;
97pub use renderer::{GpuRenderer, RenderContext};
98pub use style::{ChartStyle, LayoutStyle};
99pub use theme::{ChartTheme, ColorScheme};
100pub use viewport::{ChartBounds, Rect, Viewport};
101
102// Re-export layer trait for external layer implementations
103pub use layers::Layer;