Saltar al contenido principal

Módulos y archivos

  • Los archivos pueden tener cualquier nombre ejemplo.rs
  • Las carpetas o módulos pueden tener cualquier nombre pero deben de tener el archivo mod.rs, /users/mod.rs
  • pub: Significa que el módulo es público y puede ser accedido desde fuera del archivo o módulo en el que está definido
  • mod: Declara un módulo en Rust, que es una forma de organizar el código en diferentes archivos o espacios de nombres. Un módulo puede contener funciones, estructuras, enumeraciones, constantes, u otros módulos

Binario

  • main.rs
  • Contiene un archivo main.rs, que actúa como punto de entrada de la aplicación
  • El objetivo de un proyecto binario es ser ejecutado como una aplicación completa
  • Este tipo de proyecto tiene un Cargo.toml con una entrada [[bin]] o simplemente [package]
  • El objetivo principal es ejecutar lógica de negocio o iniciar procesos (por ejemplo, un servidor API)

Ejemplo

Estructura

my-project/
├── Cargo.toml
└── src/
├── main.rs # Punto de entrada de la aplicación
├── books/
│ └── mod.rs # Lógica relacionada con "books"
├── config/
│ └── mod.rs # Lógica relacionada con configuración
├── router.rs # Lógica relacionada con el enrutamiento de la API
└── lib.rs # Funcionalidad común (helpers).

main.rs

  • Este archivo es el punto de entrada de la aplicación
  • Se deben declarar o importar todos los módulos que se van a usar (config/mod.rs, router.rs, etc.) para poder acceder a las funciones o características
  • Se accede a las funciones con use crate::<module>::<funcion>;
  • Las funciones o características deben ser pub
src/main.rs
// Agregar o "importar" todos los modulos definidos
mod books;
mod config;
mod router;

use crate::router::setup_router;

fn main() {
let config = config::load(); // Carga configuración del módulo `config`.
let app = setup_router(); // Configura las rutas desde el módulo `router`.

// Iniciar servidor en el puerto especificado en la configuración.
app.listen(config.server_address).unwrap();
}

Librería

Librería

  • lib.rs
  • El archivo lib.rs es el punto de entrada principal para definir la biblioteca del proyecto o API pública
  • No es ejecutable directamente, sino que es utilizado por otros proyectos
  • Se usa para definir funciones, estructuras o módulos reutilizables
  • Una biblioteca está destinada a ser utilizada por otros programas, ofreciendo funcionalidad que otros pueden importar y reutilizar
  • Este tipo de proyecto tiene un Cargo.toml con una entrada [lib]
  • Si el proyecto está configurado como una librería en lugar de un binario, lib.rs es equivalente a lo que en un proyecto binario sería el archivo main.rs

Ejemplo

Estructura

rust-data-utils/
├── Cargo.toml
└── src/
├── lib.rs # Punto de entrada de la biblioteca
├── parser/ # Módulo para parsear diferentes formatos
│ ├── mod.rs # Exporta las funciones de parsing
│ ├── csv.rs # Funciones para manejar CSV
│ └── json.rs # Funciones para manejar JSON
├── transform/ # Transformaciones de datos
│ └── mod.rs # Funciones para transformar datos
└── errors.rs # Tipos de errores personalizados

lib.rs

  • Se declaran todos los módulos para que estén disponibles
src/lib.rs
pub mod parser;
pub mod transform;
pub mod errors;

pub use errors::DataError;

/// Función principal para procesar un archivo
pub fn process_file(path: &str, format: &str) -> Result<Vec<String>, errors::DataError> {
let data = match format {
"csv" => parser::csv::parse_file(path)?,
"json" => parser::json::parse_file(path)?,
_ => return Err(errors::DataError::UnsupportedFormat(format.to_string()))
};

Ok(transform::clean_data(data))
}

// Otras funciones públicas útiles

Accediendo a las funciones

Accediendo desde otro proyecto o módulo

  • Se utiliza el nombre del proyecto y el módulo, <project>::<module>::<function>
use rust_data_utils::{process_file, DataError};

fn main() -> Result<(), DataError> {
let data = process_file("data.csv", "csv")?;
println!("Datos procesados: {:?}", data);
Ok(())
}

Dentro de otros módulos

use crate::books;

.route("/books", get(books::get_books)