feat(rich): ChartConfig + RichExtension (#30, #45) #169

Closed
charles wants to merge 6 commits from feat/30-45-chart-rich-extension into main
Owner

Summary

Implémente les issues #30 et #45 dans la crate fractal-rich.

Issue #30fx-chart : ChartConfig + rendu ASCII

Nouveau fichier crates/fractal-rich/src/chart.rs :

  • ChartType enum : Line, Bar, Pie, Scatter (serde snake_case)
  • Dataset { label: String, data: Vec<f64>, color: Option<String> }
  • ChartOptions { x_label, y_label, legend } avec Default (legend=true)
  • ChartConfig { chart_type, title, labels, datasets, options } — tous les champs avec #[serde(default)]
  • ChartConfig::from_json(s: &str) -> Result<Self> via serde_json
  • ChartConfig::render_ascii_fallback() -> String — rendu barres ASCII avec titre, axes et légende
  • Tests unitaires inclus (roundtrip JSON + rendu ASCII)

Note : ces types (ChartType, Dataset, ChartOptions) sont distincts des types existants dans widgets.rs (ChartKind, ChartDataset) qui modélisent le widget GTK. ChartConfig du module chart est la nouvelle API publique de l'issue #30.

Issue #45RichExtension + RichConfig

Nouveau fichier crates/fractal-rich/src/extension.rs :

  • RichConfig { level: RenderLevel, max_canvas_size: (u32, u32), allow_animations: bool }Default : Standard, (640, 480), true
  • RichExtension { config: RichConfig } implémentant le trait Extension de fractal-ext
  • id() = "fractal-rich", name() = "Rich Messages"
  • on_sync_event() : détecte les blocs fx-* dans content_json et logue leur nombre
  • message_decorations() : retourne MessageDecoration::Badge { text: "Rich", css_class: "fractal-rich-badge" } si le message contient des widgets fx-*
  • Tests unitaires pour les valeurs par défaut et l'identité de l'extension

Autres changements

  • Cargo.toml : ajout de serde et serde_json (workspace)
  • lib.rs : exposition des nouveaux modules chart et extension avec leurs types publics

Closes #30
Closes #45

## Summary Implémente les issues #30 et #45 dans la crate `fractal-rich`. ### Issue #30 — `fx-chart` : ChartConfig + rendu ASCII Nouveau fichier `crates/fractal-rich/src/chart.rs` : - `ChartType` enum : `Line`, `Bar`, `Pie`, `Scatter` (serde `snake_case`) - `Dataset { label: String, data: Vec<f64>, color: Option<String> }` - `ChartOptions { x_label, y_label, legend }` avec `Default` (legend=true) - `ChartConfig { chart_type, title, labels, datasets, options }` — tous les champs avec `#[serde(default)]` - `ChartConfig::from_json(s: &str) -> Result<Self>` via `serde_json` - `ChartConfig::render_ascii_fallback() -> String` — rendu barres ASCII avec titre, axes et légende - Tests unitaires inclus (roundtrip JSON + rendu ASCII) > Note : ces types (`ChartType`, `Dataset`, `ChartOptions`) sont distincts des types existants dans `widgets.rs` (`ChartKind`, `ChartDataset`) qui modélisent le widget GTK. `ChartConfig` du module `chart` est la nouvelle API publique de l'issue #30. ### Issue #45 — `RichExtension` + `RichConfig` Nouveau fichier `crates/fractal-rich/src/extension.rs` : - `RichConfig { level: RenderLevel, max_canvas_size: (u32, u32), allow_animations: bool }` — `Default` : `Standard`, `(640, 480)`, `true` - `RichExtension { config: RichConfig }` implémentant le trait `Extension` de `fractal-ext` - `id()` = `"fractal-rich"`, `name()` = `"Rich Messages"` - `on_sync_event()` : détecte les blocs `fx-*` dans `content_json` et logue leur nombre - `message_decorations()` : retourne `MessageDecoration::Badge { text: "Rich", css_class: "fractal-rich-badge" }` si le message contient des widgets `fx-*` - Tests unitaires pour les valeurs par défaut et l'identité de l'extension ### Autres changements - `Cargo.toml` : ajout de `serde` et `serde_json` (workspace) - `lib.rs` : exposition des nouveaux modules `chart` et `extension` avec leurs types publics Closes #30 Closes #45
charles closed this pull request 2026-04-06 02:42:33 +00:00
Some checks are pending
CI / cargo check (pull_request) Has been cancelled
CI / cargo test (pull_request) Has been cancelled
CI / clippy + rustfmt (pull_request) Has been cancelled
qa
Required

Pull request closed

Sign in to join this conversation.
No description provided.