From 30734a043904ed6933169ec42338c12900807488 Mon Sep 17 00:00:00 2001 From: Anthony Mittica Date: Sun, 2 Nov 2025 15:59:23 +0100 Subject: [PATCH 1/2] Add portfolio folder with .md et svg --- .portfolio/portfolio.md | 419 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 419 insertions(+) create mode 100644 .portfolio/portfolio.md diff --git a/.portfolio/portfolio.md b/.portfolio/portfolio.md new file mode 100644 index 0000000..b8034ec --- /dev/null +++ b/.portfolio/portfolio.md @@ -0,0 +1,419 @@ +--- +title: "ReadRSS" +description: "Application de bureau (Rust) pour lire les flux RSS. Interface graphique rapide et minimale." +date: "2025-10-29" +tags: ["rust","gui","rss","desktop","egui"] +lang: "fr" + +# Configuration techStack +techStack: + - name: "Rust" + category: "language" + icon: "🦀" + - name: "egui / eframe" + category: "framework" + icon: "🖼️" + - name: "tokio" + category: "tool" + icon: "⚡" + - name: "feed-rs" + category: "tool" + icon: "📡" + - name: "ureq" + category: "tool" + icon: "🌐" + - name: "serde" + category: "tool" + icon: "💾" + - name: "Shell" + category: "language" + icon: "($(curl -s https://emojicdn.elk.sh/:-shell-?style=twitter | jq -r .em | head -n 1))" + +# Architecture du projet +architecture: + overview: "L'application suit une architecture 'headless' claire, séparant la logique métier de l'interface. Le crate `rss-core` gère toute la logique : le fetching HTTP asynchrone (via tokio et ureq), le parsing des flux (feed-rs), et la gestion de la base de données (fichiers JSON via serde). Le crate `rss-gui` est un consommateur de cette logique, se concentrant uniquement sur le rendu de l'interface graphique avec `egui` et la gestion des états de la vue." + components: + - "rss-core (Bibliothèque Rust) : Crate 'backend' indépendant (lib.rs). Il gère la structure des données (Feed, Article), la persistence (lecture/écriture JSON via serde), et expose les fonctions publiques (ex: add_feed, fetch_articles)." + - "rss-gui (Exécutable Rust) : Crate 'frontend' qui utilise eframe pour créer la fenêtre de bureau. Il implémente le trait eframe::App pour gérer le cycle de vie de l'application et le rendu." + - "tokio (Runtime Asynchrone) : Composant essentiel dans `rss-core`. Permet au `fetcher` de télécharger les flux RSS de manière non-bloquante, évitant de geler l'application." + - "feed-rs (Parseur de flux) : La bibliothèque qui transforme le texte XML brut (récupéré par ureq) en structures Rust (feed_rs::model::Feed) faciles à manipuler." + - "Gestionnaire d'état (GuiState) : La structure principale dans `rss-gui` qui contient l'état de l'interface (flux sélectionné, article sélectionné, onglet actif) et les données (rss_core::Rss)." + +# Diagrammes d'architecture (optionnel) +diagrams: + - path: "https://raw.githubusercontent.com/xAMA0x/ReadRSS/main/.portfolio/diagrams/readrss-architecture.svg" + title: "Architecture Core / GUI" + description: "Vue d'ensemble de la séparation des crates (logique et interface)" + +# URLs et liens +demo_url: "" +demo_label: "" +github_url: "https://github.com/xAMA0x/ReadRSS" +--- + +## 🎯 Vue d'ensemble + +
+

+ ReadRSS est un lecteur de flux RSS natif et minimaliste pour le bureau. Développé en Rust avec egui, il se concentre sur la rapidité et la simplicité, sans fioritures inutiles. Il gère l'ajout, le rafraîchissement et la lecture de vos flux en local, avec une interface réactive qui démarre instantanément. +

+ +
+
+
~ 3.5 Mo
+
Poids du paquet .deb
+
+
+
100%
+
Rust Natif (Core & GUI)
+
+
+
< 1s
+
Démarrage instantané
+
+
+
4
+
Collaborateurs
+
+
+
+ +### Objectifs du projet + +
+
+
+ 🎓 +
+

+ Valider le Projet de 4e Année +

+

+ Répondre au sujet imposé de la matière "Rust" à l'ESGI. L'objectif premier était de livrer un projet fonctionnel pour l'examen. +

+
+
+
+ 🦀 +
+

+ Maîtriser les Concepts de Rust +

+

+ Mettre en pratique l'ownership, le borrowing, la gestion des crates (core/gui), et la gestion d'erreurs (`Result`). +

+
+
+
+ 🖼️ +
+

+ Implémenter une GUI en Rust +

+

+ Découvrir et utiliser un framework de GUI Rust (comme `egui`) pour créer une application de bureau multiplateforme réactive. +

+
+
+
+ ⚡ +
+

+ Gérer l'Asynchrone +

+

+ Implémenter des opérations réseau (fetching RSS) non-bloquantes en utilisant un runtime asynchrone (`tokio`) pour ne pas geler l'interface. +

+
+
+
+ 🤝 +
+

+ Collaborer sur un Projet (4 étudiants) +

+

+ Travailler en équipe sur un dépôt Git partagé, gérer la séparation des modules (`rss-core`, `rss-gui`) et les dépendances `Cargo.toml`. +

+
+
+ +## 🏛️ Architecture `Core` / `GUI` + +
+

+ Le projet est construit sur une architecture "headless" propre à Rust, séparant la logique métier (Core) de la présentation (GUI). Le crate rss-core est une bibliothèque (lib.rs) qui ne sait rien de l'interface, tandis que rss-gui est un binaire (main.rs) qui importe rss-core comme une simple dépendance. +

+ +
+ +## ⚡ Moteur Asynchrone (Tokio & Fetching) + +
+

+ Pour éviter de figer l'interface utilisateur (GUI) lors des requêtes réseau, rss-core utilise tokio, le principal runtime asynchrone de Rust. Le fetcher (récupérateur de flux) est conçu pour s'exécuter dans un thread séparé et communiquer avec la GUI de manière non-bloquante. +

+ +
+ +## 🖼️ Interface Graphique (egui) + +
+

+ L'interface est entièrement construite avec egui, un framework de GUI en Rust qui utilise une approche en mode immédiat (immediate mode). Cela signifie que l'interface est redessinée à chaque frame, ce qui simplifie la gestion de l'état et permet un développement très rapide sans callbacks complexes. +

+ +
+ +## 💾 Persistence des Données (Serde & JSON) + +
+

+ Pour la persistance des données, le projet évite une base de données complexe et opte pour des fichiers JSON. C'est le crate serde (SERialisation/DEserialisation) qui gère la conversion des structures Rust (comme Feed) en texte JSON et vice-versa. +

+ +
+ +## 🎓 Compétences démontrées + +
+ +
+
+ 🦀 +

Programmation Système (Rust)

+
+
+
+ +
+
Gestion de la mémoire (Ownership)
+
Utilisation de l'ownership et du borrowing (pas de GC).
+
+
+
+ +
+
Gestion robuste des erreurs
+
Utilisation de `Result` et `Option` (pas d'exceptions).
+
+
+
+ +
+
Modélisation de données & Serde
+
Définition de `struct` et `#[derive(Serialize, Deserialize)]`.
+
+
+
+ +
+
Utilisation des Traits (Polymorphisme)
+
Implémentation de `eframe::App` et `Default`.
+
+
+
+
+ +
+
+ 🖼️ +

Développement GUI Natif

+
+
+
+ +
+
Framework `egui` (Mode immédiat)
+
UI redessinée à chaque frame, simplifiant l'état.
+
+
+
+ +
+
Gestion de l'état (GUI)
+
État centralisé dans `GuiState` et modifié par les widgets.
+
+
+
+ +
+
Composition de l'interface (Layout)
+
Utilisation de `SidePanel`, `CentralPanel`, `ScrollArea`.
+
+
+
+ +
+
Rendu multiplateforme
+
Utilisation de `eframe` pour compiler sur Linux et Windows.
+
+
+
+
+ +
+
+ +

Concurrence & Réseau

+
+
+
+ +
+
Programmation asynchrone
+
Utilisation de `async/await` et du runtime `tokio`.
+
+
+
+ +
+
Gestion de threads (`spawn_blocking`)
+
Pont entre code synchrone (`ureq`) et asynchrone (`tokio`).
+
+
+
+ +
+
Client HTTP
+
Requêtes réseau GET avec `ureq` pour récupérer les flux.
+
+
+
+ +
+
Parsing de flux (RSS/Atom)
+
Utilisation de la bibliothèque `feed-rs` pour parser le XML.
+
+
+
+
+ +
+
+ 📦 +

Gestion de Projet (Cargo)

+
+
+
+ +
+
Cargo Workspaces
+
Séparation `rss-core` (logique) et `rss-gui` (interface).
+
+
+
+ +
+
Gestion des dépendances
+
Gestion des `Cargo.toml` pour les deux crates.
+
+
+
+ +
+
Scripts de "build" (Shell)
+
Automatisation de la compilation (`build_release.sh`).
+
+
+
+ +
+
Distribution (GitHub Releases)
+
Création de binaires `.deb` (Debian) et `.zip` (Windows).
+
+
+
+
+ +
+ +## 📚 Ressources & Documentation + +
+ +
+
+ 📖 +

Documentation complète

+
+
    +
  • + + Analyse du code source Rust (Core) +
  • +
  • + + Implémentation de la GUI (egui) +
  • +
  • + + Gestion de l'état asynchrone (Tokio) +
  • +
  • + + Instructions de compilation +
  • +
+
+ → Voir les détails techniques +
+
+ +
+
+ 🗺️ +

Diagramme interactif

+
+

Visualisation complète de l'architecture avec tooltips détaillés pour chaque composant.

+
+ Crates (GUI/Core) + Logique (Rust) + Async (Tokio) + Stockage (JSON) +
+
+ → Voir l'architecture +
+
+ +
+ + + +--- + +**Archivé** | **Application Bureau** | **Projet Académique (ESGI)** From 802ed6210e88c9dea06dd040ae2f0af303df0941 Mon Sep 17 00:00:00 2001 From: Anthony Mittica Date: Sun, 2 Nov 2025 16:00:06 +0100 Subject: [PATCH 2/2] Add portfolio folder with .md et svg --- .portfolio/diagrams/diagram.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 .portfolio/diagrams/diagram.svg diff --git a/.portfolio/diagrams/diagram.svg b/.portfolio/diagrams/diagram.svg new file mode 100644 index 0000000..4473fa4 --- /dev/null +++ b/.portfolio/diagrams/diagram.svg @@ -0,0 +1 @@ +

Logique Métier (rss-core)

Utilisateur & Interface (rss-gui)

Réseau (Asynchrone)

Stockage (Synchrone)

Interagit (clic)

Dessine (chaque frame)

Appelle la logique

load()

fetch_all()

Lit/Écrit

tokio::spawn_blocking

Requête GET

Réponse XML

Structures Rust

Mise à jour

🖱️ Utilisateur

eframe::App (GUIState)

🖼️ egui (UI)

API Publique (rss_core::Rss)

store.rs (serde)

fetcher.rs (tokio)

feeds.json, config.json

ureq (Client HTTP)

🌐 Flux RSS/Atom (XML)

feed-rs (Parseur)

\ No newline at end of file