Outil CLI pour formater et valider des fichiers JSON, YAML et TOML

Outil CLI en Rust pour formater, valider et convertir fichiers JSON, YAML, TOML avec gestion robuste des erreurs et sortie lisible.

Brève Introduction

Outil CLI pour formater et valider des fichiers JSON, YAML et TOML (rust)
DESCRIPTION :
Une application CLI écrite en Rust qui permet de charger des fichiers au format JSON, YAML ou TOML, de les valider et de les afficher de manière formatée. Prend en charge la sélection du format de sortie et gère les erreurs d'analyse de manière robuste.

NOTES SUPPLÉMENTAIRES :
Cet outil est utile pour les développeurs et les administrateurs système travaillant avec des configurations dans différents formats. Il gère les erreurs clairement et permet de convertir facilement entre JSON, YAML et TOML.

EXPLICATIONS :
- Utilisation de 'clap' pour définir et gérer les arguments en ligne de commande de manière simple et robuste.
- Analyse des fichiers basée sur l'extension pour déterminer le format d'entrée.
- Utilisation de 'serde_json::Value' comme format intermédiaire universel pour manipuler les données indépendamment du format d'origine.
- Pour TOML, conversion de toml::Value en serde_json::Value via sérialisation et désérialisation JSON pour uniformité.
- Gestion des erreurs avec des messages clairs et sortie avec code 1 en cas de problème.
- Support de la sortie formatée avec indentation pour une meilleure lisibilité.

Code d'Exemple : rust

use clap::{Arg, Command};
use serde_json::Value as JsonValue;
use std::fs;
use std::path::Path;

// Fonction principale
fn main() {
    // Définition CLI avec clap
    let matches = Command::new("formattatore")
        .version("1.0")
        .author("Senior Software Engineer")
        .about("Formate et valide les fichiers JSON, YAML et TOML")
        .arg(
            Arg::new("input")
                .help("Fichier d'entrée à traiter")
                .required(true)
                .index(1),
        )
        .arg(
            Arg::new("output-format")
                .help("Format de sortie : json, yaml, toml")
                .short('o')
                .long("output-format")
                .takes_value(true)
                .default_value("json"),
        )
        .get_matches();

    // Lecture des arguments
    let input_path = matches.get_one::<String>("input").unwrap();
    let output_format = matches.get_one::<String>("output-format").unwrap().to_lowercase();

    // Lecture du fichier
    let content = match fs::read_to_string(input_path) {
        Ok(c) => c,
        Err(e) => {
            eprintln!("Erreur lors de la lecture du fichier '{}': {}", input_path, e);
            std::process::exit(1);
        }
    };

    // Détermination du format d'entrée à partir de l'extension
    let input_format = match Path::new(input_path).extension().and_then(|s| s.to_str()) {
        Some(ext) => ext.to_lowercase(),
        None => {
            eprintln!("Impossible de déterminer le format à partir du fichier d'entrée");
            std::process::exit(1);
        }
    };

    // Analyse et sérialisation
    let parsed = match input_format.as_str() {
        "json" => parse_json(&content),
        "yaml" | "yml" => parse_yaml(&content),
        "toml" => parse_toml(&content),
        _ => {
            eprintln!("Format d'entrée non supporté : {}", input_format);
            std::process::exit(1);
        }
    };

    let data = match parsed {
        Ok(d) => d,
        Err(e) => {
            eprintln!("Erreur lors de l'analyse du fichier : {}", e);
            std::process::exit(1);
        }
    };

    // Sérialisation dans le format de sortie choisi
    let output = match output_format.as_str() {
        "json" => serde_json::to_string_pretty(&data),
        "yaml" => serde_yaml::to_string(&data),
        "toml" => toml::to_string_pretty(&data),
        _ => {
            eprintln!("Format de sortie non supporté : {}", output_format);
            std::process::exit(1);
        }
    };

    match output {
        Ok(s) => println!("{}", s),
        Err(e) => {
            eprintln!("Erreur lors de la sérialisation : {}", e);
            std::process::exit(1);
        }
    }
}

// Fonction pour parser JSON
fn parse_json(input: &str) -> Result<JsonValue, serde_json::Error> {
    serde_json::from_str(input)
}

// Fonction pour parser YAML
fn parse_yaml(input: &str) -> Result<JsonValue, serde_yaml::Error> {
    serde_yaml::from_str(input)
}

// Fonction pour parser TOML
fn parse_toml(input: &str) -> Result<JsonValue, toml::de::Error> {
    // toml::Value n'implémente pas directement Serialize/Deserialize compatible avec JsonValue,
    // donc on convertit toml::Value en chaîne JSON puis en JsonValue
    let toml_val: toml::Value = toml::from_str(input)?;
    let json_str = serde_json::to_string(&toml_val).map_err(|e| toml::de::Error::custom(e.to_string()))?;
    let json_val = serde_json::from_str(&json_str).map_err(|e| toml::de::Error::custom(e.to_string()))?;
    Ok(json_val)
}
×
×
×
Veux-tu régénérer la réponse ?
×
Exporter le chat
Choisissez le format d'export
⏳ Generazione PDF in corso…
Allegati
×
⚠️ Vous êtes sur le point de fermer le chat et de passer au générateur d’images. Si vous n’êtes pas connecté, vous perdrez notre conversation. Confirmez-vous ?
👁 Tu consultes une discussion partagée en mode temporaire. Elle ne sera pas enregistrée.
💬
×
Prompts enregistrés
×
Note privée
×
Étiquette
×
Rechercher dans toutes les discussions
×
Vos insights
Analyse en cours…
×
Préférences IA
Nom de l'assistant 30
Longueur des réponses
Modèle IA
Réponses structurées
Inclure des exemples
Utiliser des emojis
Guide-moi, ne résous pas Des indices et des questions plutôt que la réponse toute faite
Plus de réglages →
×
Partager cette discussion
Toute personne ouvrant ce lien pourra consulter la discussion ou l'ajouter à son profil comme discussion personnelle.
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
Discussion partagée
Quelqu'un a partagé une discussion avec toi. Veux-tu seulement la consulter ou l'ajouter à tes discussions ?
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
×

📌 Messages enregistrés

Chargement...

×

Historique des discussions

programmes-exemples · HISTORIQUE DU CHAT

Chargement...

Préférences IA

×
  • 🟢 BasiqueRéponses rapides et essentielles pour étudier
  • 🔵 MoyenQualité supérieure pour étude et programmation
  • 🟣 AvancéRaisonnement complexe et analyses détaillées
Expliquer les étapes

Qu'est-ce qu'il faut ?

CLI : utilise la crate 'clap' pour l'analyse des arguments en ligne de commande.

Parsing : utilise 'serde' avec 'serde_json', 'serde_yaml' et 'toml' pour l'analyse et la sérialisation des formats respectifs.

Sortie : affiche le contenu formaté ou des messages d'erreur détaillés à l'écran.

Dépendances Cargo.toml :
  • clap = { version = "4.1", features = ["derive"] }
  • serde = { version = "1.0", features = ["derive"] }
  • serde_json = "1.0"
  • serde_yaml = "0.9"
  • toml = "0.5"

Aucun branchement matériel ou câblage requis, étant une application CLI logicielle.

Configuration : aucune configuration externe requise, tout est géré via les arguments CLI.

Sujets Similaires

Calculatrice en ligne de commande avec gestion des erreurs
Calculatrice en ligne de commande en Rust avec gestion des erreurs pour opérations arithmétiques simples et retour clair en cas d’entrée invalide ou division pa
Simulateur de lancer de dés avec statistiques
Simulateur en Rust pour lancer un dé à 6 faces plusieurs fois avec statistiques de fréquence et pourcentage affichés. Entrée utilisateur simple et contrôle des
Application CLI pour renommer des fichiers en lot
Application CLI en Rust pour renommer en lot des fichiers avec préfixe ou suffixe, gestion des erreurs et mode dry-run pour éviter les modifications accidentell
Utilitaire pour fusionner plusieurs fichiers texte en un seul
Programme Rust pour fusionner plusieurs fichiers texte en un seul fichier de sortie, simple, robuste et sans dépendances externes, avec gestion d’erreurs claire
Mini système de notes rapides sauvegardées en Markdown
Mini système en Rust pour créer, sauvegarder et lire des notes rapides en Markdown dans un dossier local sans base de données.
Outil CLI pour rechercher du texte dans des fichiers (grep simplifié)
Outil CLI en Rust pour rechercher un mot dans un fichier texte, simple et efficace, inspiré de grep avec gestion des erreurs et arguments en ligne de commande.
Mini moteur de template pour générer des pages HTML statiques
Mini moteur de template en Rust pour générer des pages HTML statiques en remplaçant simplement des variables avec HashMap, sans dépendances externes.
Bibliothèque pour lire et écrire des fichiers INI avec une API ergonomique en Rust
Bibliothèque Rust pour lire et écrire des fichiers INI avec une API simple, gestion des sections, clés/valeurs, commentaires et erreurs sans dépendances externe