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á definidomod: 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.tomlcon 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.rses 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.tomlcon una entrada[lib] - Si el proyecto está configurado como una librería en lugar de un binario,
lib.rses equivalente a lo que en un proyecto binario sería el archivomain.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)