8 octobre 2025

Un NetworkKit plus accessible

Les premiers retours sur NetworkKit ont été encourageants ! Le repo compte actuellement 34 stars. Un chiffre qui augmente chaque semaine. J’ai également reçu quelques retours qui m’ont permis de réfléchir à la version 1.2.0, disponible dès aujourd’hui !

Typage des réponses

Jusqu’à présent, le type de la réponse était inféré par le type de la variable déclarée au moment du perform.

// Compile avec le type
let users: Response<[Users]> = try await client.perform(.getUsers)
 
// Ne compile pas sans le type
// Generic parameter 'T' could not be inferred
let users = try await client.perform(.getUsers)

Je préfère généralement typer explicitement les variables. Mais je dois admettre que ce comportement va à l’encontre de la simplicité de prise en main de NetworkKit. D’autant plus qu’il faut obligatoirement ajouter le type générique Response<>, qui est propre au package.

Face à ce constat, j’ai rapidement publié une mise à jour mineure qui permettait d’associer le type de la réponse directement à la requête.

@Get("/users", of: [User].self)
struct GetUsers {
    // La macro @Get ajoute le type associé
    // typealias Response = [Users]
}
 
// Fonctionne désormais sans type explicite
let users = try await client.perform(.getUsers)

Cette méthode fonctionne, mais j’étais assez peu satisfait de la syntaxe. Il arrive d’avoir un type de réponse qui est propre à une seule requête. Dans ce cas, on aimerait, comme pour le @Body, déclarer uniquement le type dans la requête de cette manière :

@Get("/users", GetUsers.ResponseDto.self)
struct GetUsers {
    struct ResponseDto: Decodable {
        let id: String
        let name: String
    }
}

Mais on se retrouve avec une syntaxe plus longue et plus compliquée. Tout l’inverse de ce que NetworkKit est censé résoudre.

La macro @Response

Comme la macro @Body, la macro @Response apporte une solution simple et élégante à ce problème. Il est désormais possible de déclarer le type de la réponse en interne :

@Get("/user/:id")
struct GetUser {
    @Path
    let id: String
 
    @Response
    struct UserDto {
        let id: String
        let name: String
    }
}

Ou de réutiliser un type existant de cette manière :

@Get("/users")
@Response([User].self)
struct GetUsers { }

La syntaxe est désormais beaucoup plus claire et flexible !

Documentation

En parlant d’accessibilité, la documentation est le point d’entrée des devs sur votre package. Ne la négligez pas !

J’ai renforcé la documentation du package de manière générale et j’ai également publié la doc au format DocC.

La DocC de NetworkKit La documentation au format DocC permet de guider rapidement un dev sur l’utilisation de votre outil.

Elle contient quelques articles qui permettent de commencer rapidement à utiliser le package ainsi que des explications sur les références de NetworkKit. N’hésitez pas à me faire des retours !

C’est le moment de l’essayer

J’utilise NetworkKit professionnellement dans de gros projets depuis plusieurs années et je n’ai jamais été autant satisfait de son efficacité. Peut-être qu’il est temps de l’essayer ?

looping arrowsuivez-moi ici !