Declarar un comando
Un atributo sobre una función normal. Qué hace ese atributo exactamente, qué exige de la firma, y por qué el comando sigue siendo una función de Rust corriente que puedes llamar y probar sin ningún puente.
El atributo
use serde::Serialize;#[derive(Serialize)]pub struct Resumen { pub ficheros: usize, pub bytes: u64,}#[tauri::command]pub async fn resumir_carpeta(ruta: String) -> Result<Resumen, ErrorPayload> { // … tu lógica, sin nada de Tauri dentro Ok(Resumen { ficheros: 128, bytes: 4_200_000 })}Lo que el atributo genera, en una frase: una envoltura que sabe deserializar los argumentos desde JSON, llamar a tu función, y serializar lo que devuelva. Esa envoltura es lo que el manejador del nivel 14.2 registra; tu función se queda intacta al lado.
De ahí sale la propiedad más útil del diseño:
// El comando es una función normal. Se puede llamar desde Rust.let r = resumir_carpeta("/tmp".into()).await?;// Y se puede probar sin ventana, sin webview y sin bucle de eventos.#[cfg(test)]mod tests { #[tokio::test] async fn resume_una_carpeta_vacia() { let r = super::resumir_carpeta(dir_temporal()).await.unwrap(); assert_eq!(r.ficheros, 0); }}Es la consecuencia directa de que la aplicación viva en una librería —nivel 6.4— y de que el atributo envuelva en vez de transformar.
Las restricciones de la firma
El atributo no acepta cualquier función, y cada restricción tiene su motivo:
Lo que el comando no debe llevar dentro
Una recomendación que paga a los seis meses: que el cuerpo del comando no sea tu lógica.
// El comando: la frontera. Traduce, valida y delega.#[tauri::command]pub async fn resumir_carpeta(ruta: String) -> Result<Resumen, ErrorPayload> { let p = validar_ruta(&ruta)?; Ok(catalogo::resumir(&p).await?)}El comando se queda con lo que es de la frontera —validar lo que viene de fuera, convertir tipos, traducir el error a la forma que cruza— y llama a una función normal que tiene la lógica. Tres razones:
- La lógica se prueba sin pensar en Tauri, con los tipos que le convengan.
- Se reutiliza desde otro binario del paquete, desde una tarea de fondo, desde móvil.
- La frontera se lee de un vistazo: mirando solo los comandos se ve la superficie entera, que es la propiedad del nivel 13.2.
Un comando de treinta líneas con lógica dentro no está mal escrito; está en el sitio equivocado.