From edc38f7353a6204bc62e786b3568f7a6ad3e3d2d Mon Sep 17 00:00:00 2001 From: Levi Neely Date: Tue, 4 Aug 2026 12:48:39 +0200 Subject: [PATCH] fsedsl: simplify README usage section --- fsedsl/README.md | 107 ++++++++++++++--------------------------------- 1 file changed, 31 insertions(+), 76 deletions(-) diff --git a/fsedsl/README.md b/fsedsl/README.md index f743b39..a2ee913 100644 --- a/fsedsl/README.md +++ b/fsedsl/README.md @@ -105,61 +105,37 @@ func main() { } ``` -## Integration Guide +## Usage -For larger projects, create an adapter package that specializes fsedsl for your context type. - -### Step 1: Define your context type and type aliases +Define your context type, then create type and function aliases that bake it in: ```go -// myproject/fs/adapter.go package fs import "git.lneely.de/lkn/fsedsl" // Ctx carries runtime dependencies for handler functions. type Ctx struct { - DB *Database - User *User - Session *Session + DB *Database + User *User } -// Type aliases for external use -type FsNodeDecl = fsedsl.FsNodeDecl[Ctx] -type NodeOption = fsedsl.NodeOption[Ctx] -type Binding = fsedsl.Binding[Ctx] -type Tree = fsedsl.Tree -type File = fsedsl.File -``` +// Type aliases for external consumers +type ( + FsNodeDecl = fsedsl.FsNodeDecl[Ctx] + Binding = fsedsl.Binding[Ctx] + Tree = fsedsl.Tree +) -### Step 2: Create local function aliases - -In the file where you define your spec, create package-local variable aliases -that bake in your context type. This keeps the spec clean without requiring -`[Ctx]` on every call: - -```go -// myproject/fs/spec.go -package fs - -import "git.lneely.de/lkn/fsedsl" - -// Local aliases for fsedsl constructors, specialized to Ctx. +// Function aliases for clean spec definitions var ( - DirNode = fsedsl.DirNode[Ctx] - FileNode = fsedsl.FileNode[Ctx] - Each = fsedsl.Each[Ctx] - Doc = fsedsl.Doc[Ctx] - Read = fsedsl.Read[Ctx] - Write = fsedsl.Write[Ctx] - Stream = fsedsl.Stream[Ctx] - BlockOnce = fsedsl.BlockOnce[Ctx] - Request = fsedsl.Request[Ctx] - Remove = fsedsl.RemoveNode[Ctx] - Stat = fsedsl.StatOverride[Ctx] - UID = fsedsl.UID[Ctx] - GID = fsedsl.GID[Ctx] - Bind = fsedsl.Bind[Ctx] + DirNode = fsedsl.DirNode[Ctx] + FileNode = fsedsl.FileNode[Ctx] + Each = fsedsl.Each[Ctx] + Doc = fsedsl.Doc[Ctx] + Read = fsedsl.Read[Ctx] + Write = fsedsl.Write[Ctx] + // ... add others as needed ) var Spec = DirNode("/", @@ -169,58 +145,37 @@ var Spec = DirNode("/", return []byte("1.0.0\n"), nil }), ), - - DirNode("users", - Doc("User management"), - Each("{user}", userBindings, - FileNode("name", 0444, - Read(func(ctx Ctx) ([]byte, error) { - return []byte(ctx.User.Name + "\n"), nil - }), - ), + Each("{user}", userBindings, + FileNode("name", 0444, + Read(func(ctx Ctx) ([]byte, error) { + return []byte(ctx.User.Name + "\n"), nil + }), ), ), ) func userBindings(ctx Ctx) ([]Binding, error) { - users, err := ctx.DB.ListUsers() - if err != nil { - return nil, err - } - + users, _ := ctx.DB.ListUsers() var out []Binding for _, u := range users { - user := u // capture for closure + user := u out = append(out, Binding{ Name: user.Username, Aliases: []string{user.ID}, - Applier: func(c Ctx) Ctx { - c.User = user - return c - }, + Applier: func(c Ctx) Ctx { c.User = user; return c }, }) } return out, nil } ``` -### Step 3: Build and use the tree +Build and use: ```go -// myproject/main.go -package main - -import ( - "myproject/fs" - "git.lneely.de/lkn/fsedsl" -) - -func main() { - ctx := fs.Ctx{DB: connectDB()} - tree := fsedsl.BuildTree(fs.Spec, ctx) - - // Use tree.List(), tree.Open(), tree.Stat(), etc. -} +tree := fsedsl.BuildTree(fs.Spec, fs.Ctx{DB: db}) +entries, _ := tree.List() +f, _ := tree.Open("alice/name") +data, _ := f.Read() ``` ## API Reference