La capa de red completa
Todo lo de este nivel en un solo módulo: cliente reutilizado, destinos tipados, testigo por destino, reintentos, límites y errores que distinguen las causas.
Los destinos, tipados
La pieza que cierra el nivel 48.2 por construcción:
pub enum Destino { ProyectosRecientes { limite: u32 }, Proyecto { id: ProyectoId }, SubirAdjunto { proyecto: ProyectoId }, RefrescarSesion,}impl Destino { fn url(&self, base: &Url) -> Url { /* … */ } fn metodo(&self) -> Method { /* … */ } fn lleva_testigo(&self) -> bool { !matches!(self, Destino::RefrescarSesion) } fn se_puede_reintentar(&self) -> bool { self.metodo().is_safe() }}Cuatro propiedades por destino, decididas una vez: la URL, el método, si lleva credenciales —nivel 48.2— y si es seguro reintentarlo.
La última es la que evita el error de reintentar una operación que ya se aplicó: reintentar una lectura es gratis; reintentar una escritura puede duplicarla.
Reintentar con criterio
Y la espera creciente con algo de aleatoriedad: si mil clientes reintentan a la vez tras una caída, sincronizados, tumban el servidor al volver. Añadir una variación aleatoria a cada espera lo evita, y son dos líneas.
Los errores que la interfaz necesita
No un tipo genérico, sino los casos que producen respuestas distintas:
pub enum ErrorRed { SinConexion, // «sin conexión» — nivel 48.3 TiempoAgotado, // «está tardando; ¿reintentar?» NoAutorizado, // pedir credenciales — nivel 38.4 Servidor { codigo: u16 }, // «algo va mal en el servicio» Certificado, // el mensaje del nivel 48.4 Aplicacion { mensaje: String }, // lo que tu servicio explique}Cada variante lleva a una interfaz distinta, y ésa es la prueba de que la separación merece la pena: si dos variantes producen la misma pantalla, sobra una.
Los valores por omisión
Lo que la capa trae puesto sin que nadie lo pida:
El último punto merece cuidado: registrar peticiones es muy útil para diagnosticar y es la vía más común por la que un secreto acaba en un fichero de registro. Registrar el destino tipado —que no es una URL con parámetros— evita la mayor parte del problema por construcción.