Aller au contenu

La colonne vertébrale des données

go-widgets/data : des enregistrements typés avec validation, un moteur de requêtes pur, et un stockage qui exécute le même pipeline dans le processus ou via gRPC, en natif comme en wasm.

go-widgets/data est sans interface : il importe la bibliothèque standard et mvvm, et aucun widget.

ÉlémentCe que c’est
Value, Kindun scalaire typé comparable : chaîne, entier, flottant, booléen
Record, Schema, Field, Ruleune ligne typée et sa validation
Query → Apply → Viewle moteur de requêtes : filtrer, trier, grouper, paginer, agréger
Proxyla jonction avec le back-end : List, Query, Mutate
MemoryProxyle back-end dans le processus
grpcproxy.Server, grpcproxy.Clientle même contrat via gRPC, transporté sur une WebSocket
Store[R]une collection typée, publiée sous forme d’mvvm.ObservableList

La même réponse, en local ou à distance

Store parle à un Proxy sans jamais savoir lequel. Apply est une fonction pure des enregistrements et de la requête, si bien que le client et le serveur exécutent le même code sur les mêmes lignes — et un MemoryProxy et un grpcproxy.Client renvoient des vues identiques à l’octet près. Le test de conformité vérifie exactement cela : une batterie de requêtes de tri, de filtre, de groupement, de pagination et d’agrégation à travers les deux proxys et à travers le moteur, chaque résultat mis sous forme canonique, les trois comparés octet par octet.

Le transport WebSocket se compile pour js/wasm, si bien qu’une application de navigateur atteint le même service par le même client.

store := data.NewStore(mem, codec) // or a grpcproxy.Client: nothing else changes
store.SetQuery(data.Query{Sorts: []data.Sort{{Field: "salary", Desc: true}}, Limit: 20})
store.Load(ctx)
items := store.Items() // bind this to a view

tkbind.BindTable place un stockage derrière une Table de la boîte à outils : un clic sur l’en-tête trie, un regroupement groupe, et une modification de cellule validée devient une mutation via le proxy — le même aller-retour, en local ou à distance.

Créée le par tannevaled

Modifiée le par tannevaled