In questo post, implementeremo un'interfaccia di riga di comando che accetterà un file di marcatura come argomento di riga di comando, leggerà il suo contenuto e stamperà l'intero contenuto del file nel terminale. Dopo aver fatto questo, saremo bene sulla nostra strada per iniziare a implementare il parsing di testi di base, intestazioni, elenchi e così via. Spiegherò tutti i codici in dettaglio, e alla fine, ti darò l'intero codice in modo che tu possa provare senza problemi. Moduli richiesti Ci sono due moduli da utilizzare: - we need module for interacting with the environment the program is currently running in. Now, we use it here to access the command-line arguments passed to our program. std::env env - we need for file operations like reading from and writing to files. std::fs fs use std::env; use std::fs; Ottenere il file markdown dalla riga di comando. Dopo aver ottenuto i moduli richiesti, possiamo iniziare a lavorare per ottenere il file di marcatura dall'argomento della riga di comando. Da ora in poi, scriveremo ogni riga di codice all'interno della funzione principale. let args: Vec<String> = env::args().collect(); Vediamo cosa fa questa linea. env::args() - Questa funzione restituisce al programma un iteratore degli argomenti forniti nella riga di comando. collect() - Quindi stiamo usando il metodo collect() per consumare l'iteratore e raccogliere tutti gli elementi da quel iteratore in una collezione. Vec<String> - Per memorizzare tutti gli elementi dell'iteratore, stiamo usando la collezione Vector che memorizza gli elementi del tipo String. Abbiamo dato il nome variabile di questo Vec<String> come args. Ora, gestiamo il caso in cui l'utente sia consapevolmente o inconsapevolmente salta dando il file di marcatura nell'argomento della riga di comando. if args.len() < 2 { println!("Please provide a markdown file"); return; } Qui, stiamo dicendo che se il numero di comandi è inferiore a 2, quindi stampare una dichiarazione chiedendo all'utente di fornire un file di marcatura e quindi tornare dal programma. [!Nota] Numero di argomenti Nella riga di comando, il primo argomento è il nome del programma. Abbiamo bisogno di un altro argomento che rappresenti il nome del file. [!Nota] Numero di argomenti Nella riga di comando, il primo argomento è il nome del programma. Abbiamo bisogno di un altro argomento che rappresenti il nome del file. Essere almeno due. args Leggere il file e stampare il contenuto. Ora, archiviamo il nome del file che abbiamo ottenuto dall'argomento della riga di comando. let filename = &args[1]; Stiamo creando una variabile e salvare il nome del file dal secondo argomento della riga di comando. filename Ora, cominciamo a leggere il contenuto crudo del file e stampare l'intero contenuto come è. println!("Attempting to read file: {}", filename); let content = fs::read_to_string(filename).expect("Something went wrong reading the file"); println!("File content:\n{}", content); In primo luogo, stiamo semplicemente stampando una dichiarazione di logging per sapere che stiamo cercando di leggere il file. fs::read_to_string(filename) - Questa funzione proviene dal modulo fs che legge l'intero contenuto del file specificato dal nome del file. Quindi, stiamo memorizzando l'intero contenuto nella variabile di contenuto e infine stampando l'intero contenuto sulla console. Prima di spiegare il Metodo, comprendiamo un tipo di dati specifico in Rust. expect() in riposo Risultato Risultato In Rust, il modo in cui gestiamo le operazioni che potrebbero fallire è è un enum con due varianti: Result enum Result<T, E> { Ok(T), // Success - contains the value of type T Err(E), // Error - contains the error of type E } Ora, torniamo alla funzione. Se si guarda nei doc, restituisce un tipo, e per un caso di successo, restituisce un tipo, e per un caso di fallimento, restituisce un Tipo di . fs::read_to_string() Result String std::io::Error Ora, colleghiamo questo con il Il metodo. expect() Questo Il metodo è un acronimo che dice: expect() se fs::read_to_string() funziona bene e restituisce Ok(string), quindi restituisce il valore della stringa. se fs::read_to_string() non funziona, allora crash il programma con il messaggio di errore personalizzato (“Qualcosa è andato storto nel leggere il file”). Testare il programma Per testare, creiamo un file nella radice del progetto e mettere qualche testo di marcatura casuale. test.md # this is a header - this is a list this is a normal text Ora apri il tuo terminale dal tuo directory del progetto e digitare il comando: cargo run -- test.md Compilerà e eseguirà il codice e ti darà la seguente uscita. Questa uscita mostra che possiamo ottenere con successo il contenuto del file di marcatura e stampare i suoi dati crudi. Codice sorgente completo use std::env; use std::fs; fn main() { let args: Vec<String> = env::args().collect(); if args.len() < 2 { println!("Please provide a markdown file"); return; } let filename = &args[1]; println!("Attempting to read file: {}", filename); let content = fs::read_to_string(filename).expect("Something went wrong reading the file"); println!("File content:\n{}", content); } Conclusione In questo post, abbiamo capito come interagire con la riga di comando e anche leggere il file di marcatura dall'argomento della riga di comando. dove sappiamo che le cose potrebbero andare storte, e ci siamo assicurati che il nostro programma possa gestire questo. Result Ora, capiamo di leggere e stampare tutto il contenuto del file di marcatura. Dal prossimo post, stiamo lentamente implementando il nostro algoritmo di analisi passo dopo passo e coprendo testo di base, intestazioni, elenchi e altre cose una per una. Sono davvero eccitato per il prossimo post; spero che tu sia eccitato anche.