# Commandes Tauri

Le backend Rust expose **8 commandes** au frontend, enregistrées dans `lib.rs` via
`generate_handler![]`. Le frontend les appelle avec
`window.__TAURI__.core.invoke('<nom>', { <args> })`.

Cette page sert de référence : signature, arguments, valeur de retour et comportement de
chaque commande.

## Rendu Markdown

### `render_markdown`
```
render_markdown(content: String) -> String
```
- **Args** : `content` — Markdown brut.
- **Retour** : HTML.
- **Comportement** : rendu via `ComrakPreviewRenderer` (sans extensions, aperçu rapide).
- **Frontend** : `services/markdown.js`.

### `convert_file`
```
convert_file(path: String) -> Result<String, String>
```
- **Args** : `path` — chemin absolu d'un fichier `.md`.
- **Retour** : `Ok(html)` ou `Err(message)`.
- **Comportement** : lit le fichier puis le rend via `ComrakRenderer` (toutes les extensions
  activées : tables, strikethrough, autolink, tasklist + coloration syntaxique).
- **Frontend** : `services/markdown.js`. C'est la commande utilisée pour afficher un document
  dans le lecteur.

### `get_syntax_highlight_css`
```
get_syntax_highlight_css() -> String
```
- **Args** : aucun.
- **Retour** : feuille CSS de coloration syntaxique.
- **Comportement** : génère le CSS du thème `syntect` `base16-ocean.dark`.

## Fichiers

### `list_md_files`
```
list_md_files(dir: String) -> Result<Vec<String>, String>
```
- **Args** : `dir` — chemin d'un répertoire.
- **Retour** : `Ok([chemins…])` (triés alphabétiquement) ou `Err(message)`.
- **Comportement** : parcourt le répertoire **récursivement**, ignore les fichiers/dossiers
  cachés (commençant par `.`), ne retient que les `.md`.
- **Frontend** : `services/files.js`.

## Surveillance de fichiers (watch)

> Ces commandes sont implémentées et fonctionnelles côté backend, mais **l'interface ne les
> appelle pas encore**. Le rechargement automatique n'est donc pas actif. Voir
> [Fonctionnalités](../1-fonctionnel/1.2-Fonctionnalites.md#fonctionnalité-présente-mais-non-branchée).

### `start_watch`
```
start_watch(path: String) -> Result<(), String>
```
- **Args** : `path` — fichier ou répertoire à surveiller.
- **Comportement** :
  - arrête le watcher précédent (un seul actif à la fois, stocké dans `WatcherState`) ;
  - surveille en mode récursif si `path` est un répertoire, non récursif si c'est un
    fichier ;
  - lance une boucle de **débounce de 80 ms** qui ne retient que les fichiers `.md` non
    cachés, et émet l'événement Tauri **`file-changed`** avec un payload `{ path }`.
- **Frontend** : `services/watcher.js` (`startWatch`).

### `stop_watch`
```
stop_watch() -> ()
```
- **Comportement** : arrête le watcher actif (le supprime de `WatcherState`, ce qui termine
  le thread de surveillance).
- **Frontend** : `services/watcher.js` (`stopWatch`).

### Événement `file-changed`
- Émis par le backend pendant la surveillance.
- Payload : `{ path: String }` — chemin du fichier modifié.
- Écoutable côté frontend via
  `window.__TAURI__.event.listen('file-changed', callback)` (`onFileChanged`).
- **Consommation** : `router.js` enregistre le listener au démarrage (`initWatcher`) et,
  à chaque événement, recharge le document affiché s'il correspond au chemin modifié et
  rafraîchit la sidebar si l'arborescence `.md` du dossier surveillé a changé. La
  surveillance est démarrée dans `openPath` (via `startWatch`) et arrêtée dans `showHome`
  (via `stopWatch`).

## Thèmes

### `list_themes`
```
list_themes() -> Vec<ThemeDto>   // ThemeDto { id: String, label: String }
```
- **Args** : aucun.
- **Retour** : les 6 thèmes (`default`, `dark`, `sepia`, `large-text`, `emerald`,
  `shell-indigo`) avec leur libellé.
- **Frontend** : `services/themes.js`.

### `get_theme_css`
```
get_theme_css(id: String) -> Option<String>
```
- **Args** : `id` — identifiant du thème.
- **Retour** : le CSS du thème (`Some`) ou `None` si l'identifiant est inconnu.
- **Comportement** : le CSS est intégré au binaire (`include_str!` sur
  `resources/themes/<id>.css`).
- **Frontend** : `services/themes.js`.

## Récapitulatif

| Commande | Signature | Retour |
|---|---|---|
| `render_markdown` | `(content: String)` | `String` |
| `convert_file` | `(path: String)` | `Result<String, String>` |
| `get_syntax_highlight_css` | `()` | `String` |
| `list_md_files` | `(dir: String)` | `Result<Vec<String>, String>` |
| `start_watch` | `(path: String)` | `Result<(), String>` |
| `stop_watch` | `()` | `()` |
| `list_themes` | `()` | `Vec<ThemeDto>` |
| `get_theme_css` | `(id: String)` | `Option<String>` |

## Voir aussi

- [Architecture](2.1-Architecture.md)
- [Thèmes et personnalisation](../1-fonctionnel/1.4-Themes-et-personnalisation.md)
