En este post, implementaremos una interfaz de línea de comandos que aceptará un archivo de marcación como un argumento de línea de comandos, leerá su contenido y imprimirá todo el contenido del archivo en el terminal. Después de hacer esto, estaremos bien en nuestro camino para empezar a implementar el análisis de textos básicos, encabezados, listas, y así sucesivamente. Explicaré todo el código en detalle, y al final, te daré todo el código para que puedas probarlo sin ningún problema. Módulos requeridos Hay dos módulos que debemos utilizar: - 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; Obtener el archivo marcado desde la línea de comandos. Después de obtener los módulos requeridos, podemos comenzar a trabajar en obtener el archivo de marcado desde el argumento de la línea de comandos. let args: Vec<String> = env::args().collect(); Vamos a entender lo que hace esta línea. env::args() - Esta función devuelve un iterador de los argumentos proporcionados en la línea de comandos al programa. recoger() - A continuación, estamos utilizando el método recoger() para consumir el iterador y recoger todos los elementos de ese iterador en una colección. Vec<String> - Para almacenar todos los elementos del iterador, estamos usando la colección de vectores que almacena elementos del tipo String. Hemos dado el nombre variable de este Vec<String> como args. Ahora, vamos a tratar el caso en el que el usuario o bien conscientemente o inconscientemente salta dando el archivo de marcado en el argumento de la línea de comandos. if args.len() < 2 { println!("Please provide a markdown file"); return; } Aquí, estamos diciendo que si el número de comandos es menor a 2, luego imprima una declaración pidiendo al usuario que proporcione un archivo de marcaje y luego regrese del programa. [!Nota] Número de argumentos En la línea de comandos, el primer argumento es el nombre del programa. Necesitamos otro argumento que represente el nombre del archivo. Por lo tanto, necesitamos que la longitud de las args sea al menos 2. [!Nota] Número de argumentos En la línea de comandos, el primer argumento es el nombre del programa. Necesitamos otro argumento que representará el nombre del archivo. Serán al menos dos. args Leer el archivo y imprimir su contenido. Ahora, guardemos el nombre de archivo que hemos obtenido del argumento de la línea de comandos. let filename = &args[1]; Creamos una variable y guardar el nombre del archivo desde el argumento de la línea de comandos 2. filename Ahora, comenzemos a leer el contenido crudo del archivo y imprimir todo el contenido como está. 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); Primero, simplemente imprimimos una declaración de registro para saber que estamos tratando de leer el archivo. fs::read_to_string(filename) - Esta función proviene del módulo fs que lee todo el contenido del archivo especificado por el nombre de archivo. Luego, almacenamos todo el contenido en la variable de contenido y finalmente imprimimos todo el contenido en la consola. Antes de explicar el método, entendamos un tipo de datos específico en Rust. expect() en reposo Result Resultado En Rust, la forma en que manejamos las operaciones que podrían fallar es utilizando Es un enum con dos variantes: Result enum Result<T, E> { Ok(T), // Success - contains the value of type T Err(E), // Error - contains the error of type E } Ahora, volvamos a la Si miras los documentos, devuelve un tipo, y para un caso de éxito, devuelve un tipo, y para un caso de fallo, devuelve un El tipo. fs::read_to_string() Result String std::io::Error Ahora, conectemos esto con el El método. expect() Este El método es un acrónimo que dice: expect() si fs::read_to_string() funciona bien y devuelve Ok(string), devuelve el valor de la cadena. si fs::read_to_string() no funciona, a continuación, colapse el programa con el mensaje de error personalizado ("Algo salió mal en la lectura del archivo"). Prueba el programa Para comprobarlo, vamos a crear un archivo en la raíz del proyecto y colocar algún texto de marcado aleatorio. test.md # this is a header - this is a list this is a normal text Ahora, abra su terminal desde su directorio de proyectos y escriba el comando: cargo run -- test.md Compilará y ejecutará el código y le dará la siguiente salida. Esta salida muestra que podemos obtener con éxito el contenido del archivo de marcado y imprimir sus datos brutos. Código fuente 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); } Conclusión En este post, entendimos cómo interactuar con la línea de comandos y también leemos el archivo de marcado del argumento de la línea de comandos. donde sabemos que las cosas podrían ir mal, y nos aseguramos de que nuestro programa pueda manejar eso. Result Ahora, entendemos leer e imprimir todo el contenido del archivo de marcaje. Desde el siguiente post, vamos a implementar lentamente nuestro algoritmo de análisis paso a paso y cubrir texto básico, encabezados, listas y otras cosas uno por uno.