Saltar al contenido

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

Rust
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:

Rust
// 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.

Rust
// 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.