Skip to content

Cookbook

Common patterns and recipes for Wyn.

Read a File Line by Line

wyn
var content = File.read("data.txt")
for line in content.lines() {
    println(line)
}

Parse JSON

wyn
var data = "{\"name\": \"Alice\", \"age\": 25}".parse_json()
println(data.get_string("name"))    // Alice
println("${data.get_int("age")}")  // 25

HTTP Server with JSON API

wyn
var server = Http.listen(3000)
while true {
    var req = Http.accept(server)
    var path = req.split("|")[1]

    if path == "/api/hello" {
        Http.respond(req, 200, Json.stringify({"message": "hello"}))
    } else {
        Http.respond(req, 404, "{\"error\": \"not found\"}")
    }
}

Concurrent Map

wyn
fn process(item: string) -> string {
    return item.upper()
}

var items = ["hello", "world", "wyn"]
var futures = []
for item in items {
    futures.push(spawn process(item))
}

var results = []
for f in futures {
    results.push(await f)
}
// results: ["HELLO", "WORLD", "WYN"]

CSV Processing

wyn
var csv = Csv.parse(File.read("data.csv"))
for i in 1..Csv.row_count(csv) {
    var name = Csv.get_field(csv, i, "name")
    var age = Csv.get_field(csv, i, "age")
    println(name + " is " + age + " years old")
}

String Manipulation

wyn
var s = "  Hello, World!  "
println(s.trim())                    // "Hello, World!"
println(s.trim().upper())           // "HELLO, WORLD!"
println(s.trim().replace("World", "Wyn"))  // "Hello, Wyn!"
println(s.trim().split(", ").join(" | "))  // "Hello | World!"

HashMap

wyn
var m = HashMap.new()
HashMap.set(m, "name", "Alice")
HashMap.set(m, "city", "NYC")
println(HashMap.get(m, "name"))     // Alice
println("${HashMap.len(m)}") // 2

Logging

wyn
Log.set_level(1)  // INFO and above
Log.info("starting")
Log.debug("hidden")  // suppressed
Log.warn("careful")
Log.error("failed")

Base64

wyn
var encoded = Base64.encode("secret data")
println(encoded)                         // c2VjcmV0IGRhdGE=
println(Base64.decode(encoded))          // secret data

Command-Line Arguments

wyn
var name = Args.get("name")
var verbose = Args.has("v")
if name != "" {
    println("Hello, " + name)
}

Benchmarking

wyn
fn fib(n: int) -> int {
    if n <= 1 { return n }
    return fib(n - 1) + fib(n - 2)
}

// Run with: wyn bench fib.wyn --iterations 10
fib(35)

HTTP Client

Make GET and POST requests with headers:

wyn
// Simple GET
var body = Http.get("https://api.example.com/users")
println(body)

// POST with JSON body
var resp = Http.post("https://api.example.com/users",
    Json.stringify({"name": "Alice", "role": "admin"}),
    ["Content-Type: application/json"])
println(resp)

JSON Parsing and Building

Parse nested JSON, build new objects, and handle missing keys:

wyn
var raw = File.read("config.json")
var cfg = Json.parse(raw)

var host = Json.get(cfg, "server.host")
var port = Json.get_int(cfg, "server.port")
var tags = Json.get_array(cfg, "tags")

// Build a new JSON object
var out = Json.object()
Json.set(out, "status", "ok")
Json.set(out, "count", tags.len())
println(Json.stringify(out))

CSV Processing with Filtering

Read a CSV, filter rows, and write results:

wyn
var csv = Csv.parse(File.read("sales.csv"))
var total = 0.0

for i in 1..Csv.row_count(csv) {
    var region = Csv.get_field(csv, i, "region")
    var amount = Csv.get_field(csv, i, "amount").to_float()
    if region == "US" {
        total = total + amount
    }
}

println("US total: $${total}")
File.write("report.txt", "US sales total: $${total}\n")

File Watcher

Poll a directory for changes and react:

wyn
var last_mod = 0

while true {
    var mod = File.modified("config.json")
    if mod > last_mod {
        println("Config changed, reloading...")
        var cfg = Json.parse(File.read("config.json"))
        last_mod = mod
    }
    Time.sleep(1000)
}

CLI Argument Parsing

Build a CLI tool with named flags and positional args:

wyn
var cmd = Args.get_positional(0)
var output = Args.get("output", "result.txt")
var verbose = Args.has("verbose")

if cmd == "" {
    println("Usage: mytool <command> [--output file] [--verbose]")
    return 1
}

if verbose {
    Log.set_level(0)  // DEBUG
}

Log.debug("Running command: ${cmd}")
Log.info("Output: ${output}")

Run it: wyn run tool.wyn -- process --output data.csv --verbose

SQLite CRUD

Full create/read/update/delete with a SQLite database:

wyn
var db = Db.open("app.db")
Db.exec(db, "CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT, email TEXT)")

// Create
Db.exec(db, "INSERT INTO users(name, email) VALUES(?, ?)", ["Alice", "[email protected]"])

// Read
var rows = Db.query(db, "SELECT id, name, email FROM users")
for row in rows {
    println("${row[0]}: ${row[1]} <${row[2]}>")
}

// Update
Db.exec(db, "UPDATE users SET email = ? WHERE name = ?", ["[email protected]", "Alice"])

// Delete
Db.exec(db, "DELETE FROM users WHERE name = ?", ["Alice"])
Db.close(db)

Regex Extraction

Extract patterns from text using regex:

wyn
var text = "Contact us at [email protected] or [email protected]"
var emails = Regex.find_all(text, "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}")

for email in emails {
    println("Found: ${email}")
}

// Named groups
var log = "2026-04-23 ERROR: disk full"
var m = Regex.match(log, "(\\d{4}-\\d{2}-\\d{2}) (\\w+): (.+)")
if m.matched {
    println("Date: ${m.group(1)}")   // 2026-04-23
    println("Level: ${m.group(2)}")  // ERROR
    println("Msg: ${m.group(3)}")    // disk full
}

Environment Variables

Read config from the environment with defaults:

wyn
var port = Env.get("PORT", "8080").to_int()
var db_url = Env.get("DATABASE_URL", "app.db")
var debug = Env.get("DEBUG", "false") == "true"

if debug {
    Log.set_level(0)
    Log.debug("Debug mode on")
}

println("Starting on port ${port}")
println("Database: ${db_url}")

See Also

MIT License — v1.11