#![cfg_attr(coverage_nightly, coverage(off))]
use anyhow::{Context as _, Result};
use batuta_common::display::WithDimensions;
use trueno_viz::color::Rgba;
use trueno_viz::output::{TerminalEncoder, TerminalMode};
use trueno_viz::plots::{ForceGraph, GraphEdge, GraphNode};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum TerminalTheme {
#[default]
Default,
HighContrast,
Light,
ColorblindSafe,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum NodeShape {
#[default]
Circle,
Square,
Diamond,
Triangle,
}
#[derive(Debug, Clone)]
pub struct RenderConfig {
pub width: u32,
pub height: u32,
pub theme: TerminalTheme,
pub mode: TerminalMode,
pub iterations: usize,
pub critical_threshold: f32,
pub max_nodes: usize,
pub show_labels: bool,
}
pub trait Visualizable {
fn render_terminal(&self, config: &RenderConfig) -> Result<String>;
fn node_count(&self) -> usize;
fn should_use_matrix_fallback(&self) -> bool {
self.node_count() > 100
}
}
#[derive(Debug, Clone)]
pub struct VisGraph {
pub nodes: Vec<String>,
pub edges: Vec<(usize, usize)>,
pub criticality: Vec<f32>,
}
impl VisGraph {
#[must_use]
pub fn new() -> Self {
Self {
nodes: Vec::new(),
edges: Vec::new(),
criticality: Vec::new(),
}
}
pub fn add_node(&mut self, name: String, criticality: f32) {
self.nodes.push(name);
self.criticality.push(criticality);
}
pub fn add_edge(&mut self, from: usize, to: usize) {
self.edges.push((from, to));
}
}
impl Default for VisGraph {
fn default() -> Self {
Self::new()
}
}
include!("terminal_theme.rs");
include!("terminal_rendering.rs");
include!("terminal_tests.rs");