feat: add example scripts for argparse, bytes, dataset, html, markdown, uuid, wdantic, and web chat modules
Add comprehensive demo scripts showcasing the usage of multiple Wren modules including argument parsing, byte manipulation, in-memory dataset operations, HTML encoding/slugification, markdown-to-HTML conversion, UUID generation/validation, schema validation with wdantic, and a full web chat application with REST endpoints.
2026-01-24 23:40:22 +01:00
<!DOCTYPE html>
<!-- retoor <retoor@molodetz.nl> -->
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title > File Operations - Wren-CLI Manual< / title >
< link rel = "stylesheet" href = "../css/style.css" >
< / head >
< body >
< button class = "mobile-menu-toggle" > Menu< / button >
< div class = "container" >
< aside class = "sidebar" >
< div class = "sidebar-header" >
< h1 > < a href = "../index.html" > Wren-CLI< / a > < / h1 >
< div class = "version" > v0.4.0< / div >
< / div >
< nav class = "sidebar-nav" >
< div class = "section" >
< span class = "section-title" > Getting Started< / span >
< ul >
< li > < a href = "../getting-started/index.html" > Overview< / a > < / li >
< li > < a href = "../getting-started/installation.html" > Installation< / a > < / li >
< li > < a href = "../getting-started/first-script.html" > First Script< / a > < / li >
< li > < a href = "../getting-started/repl.html" > Using the REPL< / a > < / li >
< / ul >
< / div >
< div class = "section" >
< span class = "section-title" > Language< / span >
< ul >
< li > < a href = "../language/index.html" > Syntax Overview< / a > < / li >
< li > < a href = "../language/classes.html" > Classes< / a > < / li >
< li > < a href = "../language/methods.html" > Methods< / a > < / li >
< li > < a href = "../language/control-flow.html" > Control Flow< / a > < / li >
< li > < a href = "../language/fibers.html" > Fibers< / a > < / li >
< li > < a href = "../language/modules.html" > Modules< / a > < / li >
< / ul >
< / div >
< div class = "section" >
< span class = "section-title" > API Reference< / span >
< ul >
< li > < a href = "../api/index.html" > Overview< / a > < / li >
feat: add async/await keywords, Num/String extensions, and Jinja markdown example
Add `async` and `await` token support to the Wren compiler with scheduler resolution logic, extend `Num` with `e` constant, hyperbolic trig, base conversion, and new methods (`isZero`, `gcd`, `lcm`, `digits`, etc.), extend `String` with `lower`, `upper`, `capitalize`, `title`, and regenerate `wren_core.wren.inc`. Include `Makefile` for multi-platform builds, rewrite `README.md` with updated build instructions, and add `example/await_demo.wren` and `example/jinja_markdown.wren` demonstrating new features.
2026-01-25 04:58:39 +01:00
< li > < a href = "../api/string.html" > String< / a > < / li >
< li > < a href = "../api/number.html" > Num< / a > < / li >
feat: add example scripts for argparse, bytes, dataset, html, markdown, uuid, wdantic, and web chat modules
Add comprehensive demo scripts showcasing the usage of multiple Wren modules including argument parsing, byte manipulation, in-memory dataset operations, HTML encoding/slugification, markdown-to-HTML conversion, UUID generation/validation, schema validation with wdantic, and a full web chat application with REST endpoints.
2026-01-24 23:40:22 +01:00
< li > < a href = "../api/http.html" > http< / a > < / li >
< li > < a href = "../api/websocket.html" > websocket< / a > < / li >
< li > < a href = "../api/tls.html" > tls< / a > < / li >
< li > < a href = "../api/net.html" > net< / a > < / li >
< li > < a href = "../api/dns.html" > dns< / a > < / li >
< li > < a href = "../api/json.html" > json< / a > < / li >
< li > < a href = "../api/base64.html" > base64< / a > < / li >
< li > < a href = "../api/regex.html" > regex< / a > < / li >
< li > < a href = "../api/jinja.html" > jinja< / a > < / li >
< li > < a href = "../api/crypto.html" > crypto< / a > < / li >
< li > < a href = "../api/os.html" > os< / a > < / li >
< li > < a href = "../api/env.html" > env< / a > < / li >
< li > < a href = "../api/signal.html" > signal< / a > < / li >
< li > < a href = "../api/subprocess.html" > subprocess< / a > < / li >
< li > < a href = "../api/sqlite.html" > sqlite< / a > < / li >
< li > < a href = "../api/datetime.html" > datetime< / a > < / li >
< li > < a href = "../api/timer.html" > timer< / a > < / li >
< li > < a href = "../api/io.html" > io< / a > < / li >
feat: add async/await keywords, Num/String extensions, and Jinja markdown example
Add `async` and `await` token support to the Wren compiler with scheduler resolution logic, extend `Num` with `e` constant, hyperbolic trig, base conversion, and new methods (`isZero`, `gcd`, `lcm`, `digits`, etc.), extend `String` with `lower`, `upper`, `capitalize`, `title`, and regenerate `wren_core.wren.inc`. Include `Makefile` for multi-platform builds, rewrite `README.md` with updated build instructions, and add `example/await_demo.wren` and `example/jinja_markdown.wren` demonstrating new features.
2026-01-25 04:58:39 +01:00
< li > < a href = "../api/pathlib.html" > pathlib< / a > < / li >
feat: add example scripts for argparse, bytes, dataset, html, markdown, uuid, wdantic, and web chat modules
Add comprehensive demo scripts showcasing the usage of multiple Wren modules including argument parsing, byte manipulation, in-memory dataset operations, HTML encoding/slugification, markdown-to-HTML conversion, UUID generation/validation, schema validation with wdantic, and a full web chat application with REST endpoints.
2026-01-24 23:40:22 +01:00
< li > < a href = "../api/scheduler.html" > scheduler< / a > < / li >
< li > < a href = "../api/math.html" > math< / a > < / li >
< / ul >
< / div >
< div class = "section" >
< span class = "section-title" > Tutorials< / span >
< ul >
< li > < a href = "../tutorials/index.html" > Tutorial List< / a > < / li >
< li > < a href = "../tutorials/http-client.html" > HTTP Client< / a > < / li >
< li > < a href = "../tutorials/websocket-chat.html" > WebSocket Chat< / a > < / li >
< li > < a href = "../tutorials/database-app.html" > Database App< / a > < / li >
< li > < a href = "../tutorials/template-rendering.html" > Template Rendering< / a > < / li >
< li > < a href = "../tutorials/cli-tool.html" > CLI Tool< / a > < / li >
< / ul >
< / div >
< div class = "section" >
< span class = "section-title" > How-To Guides< / span >
< ul >
< li > < a href = "index.html" > How-To List< / a > < / li >
< li > < a href = "http-requests.html" > HTTP Requests< / a > < / li >
< li > < a href = "json-parsing.html" > JSON Parsing< / a > < / li >
< li > < a href = "regex-patterns.html" > Regex Patterns< / a > < / li >
< li > < a href = "file-operations.html" class = "active" > File Operations< / a > < / li >
< li > < a href = "async-operations.html" > Async Operations< / a > < / li >
< li > < a href = "error-handling.html" > Error Handling< / a > < / li >
< / ul >
< / div >
< / nav >
< / aside >
< main class = "content" >
< nav class = "breadcrumb" >
< a href = "../index.html" > Home< / a >
< span class = "separator" > /< / span >
< a href = "index.html" > How-To Guides< / a >
< span class = "separator" > /< / span >
< span > File Operations< / span >
< / nav >
< article >
< h1 > File Operations< / h1 >
< h2 > Read Entire File< / h2 >
< pre > < code > import "io" for File
var content = File.read("document.txt")
System.print(content)< / code > < / pre >
< h2 > Write to File< / h2 >
< pre > < code > import "io" for File
File.write("output.txt", "Hello, World!")
System.print("File written!")< / code > < / pre >
< h2 > Append to File< / h2 >
< pre > < code > import "io" for File
var existing = File.exists("log.txt") ? File.read("log.txt") : ""
File.write("log.txt", existing + "New line\n")< / code > < / pre >
< h2 > Check if File Exists< / h2 >
< pre > < code > import "io" for File
if (File.exists("config.txt")) {
System.print("Config found")
var content = File.read("config.txt")
} else {
System.print("Config not found, using defaults")
}< / code > < / pre >
< h2 > Get File Size< / h2 >
< pre > < code > import "io" for File
var size = File.size("data.bin")
System.print("File size: %(size) bytes")< / code > < / pre >
< h2 > Copy File< / h2 >
< pre > < code > import "io" for File
File.copy("source.txt", "destination.txt")
System.print("File copied!")< / code > < / pre >
< h2 > Rename/Move File< / h2 >
< pre > < code > import "io" for File
File.rename("old_name.txt", "new_name.txt")
System.print("File renamed!")
File.rename("file.txt", "subdir/file.txt")
System.print("File moved!")< / code > < / pre >
< h2 > Delete File< / h2 >
< pre > < code > import "io" for File
if (File.exists("temp.txt")) {
File.delete("temp.txt")
System.print("File deleted!")
}< / code > < / pre >
< h2 > List Directory Contents< / h2 >
< pre > < code > import "io" for Directory
var files = Directory.list(".")
for (file in files) {
System.print(file)
}< / code > < / pre >
< h2 > Check if Directory Exists< / h2 >
< pre > < code > import "io" for Directory
if (Directory.exists("data")) {
System.print("Directory found")
} else {
System.print("Directory not found")
}< / code > < / pre >
< h2 > Create Directory< / h2 >
< pre > < code > import "io" for Directory
if (!Directory.exists("output")) {
Directory.create("output")
System.print("Directory created!")
}< / code > < / pre >
< h2 > Delete Empty Directory< / h2 >
< pre > < code > import "io" for Directory
Directory.delete("empty_folder")
System.print("Directory deleted!")< / code > < / pre >
< h2 > Read File Line by Line< / h2 >
< pre > < code > import "io" for File
var content = File.read("data.txt")
var lines = content.split("\n")
for (line in lines) {
if (line.count > 0) {
System.print(line)
}
}< / code > < / pre >
< h2 > Process Files in Directory< / h2 >
< pre > < code > import "io" for File, Directory
var files = Directory.list("./data")
for (filename in files) {
if (filename.endsWith(".txt")) {
var path = "./data/%(filename)"
var content = File.read(path)
System.print("%(filename): %(content.count) chars")
}
}< / code > < / pre >
< h2 > Recursive Directory Listing< / h2 >
< pre > < code > import "io" for File, Directory
var listRecursive = Fn.new { |path, indent|
var items = Directory.list(path)
for (item in items) {
var fullPath = "%(path)/%(item)"
System.print("%(indent)%(item)")
if (Directory.exists(fullPath)) {
listRecursive.call(fullPath, indent + " ")
}
}
}
listRecursive.call(".", "")< / code > < / pre >
< h2 > Find Files by Extension< / h2 >
< pre > < code > import "io" for File, Directory
var findByExtension = Fn.new { |path, ext|
var results = []
var items = Directory.list(path)
for (item in items) {
var fullPath = "%(path)/%(item)"
if (Directory.exists(fullPath)) {
var subResults = findByExtension.call(fullPath, ext)
for (r in subResults) results.add(r)
} else if (item.endsWith(ext)) {
results.add(fullPath)
}
}
return results
}
var wrenFiles = findByExtension.call(".", ".wren")
for (file in wrenFiles) {
System.print(file)
}< / code > < / pre >
< h2 > Read JSON Configuration< / h2 >
< pre > < code > import "io" for File
import "json" for Json
var loadConfig = Fn.new { |path, defaults|
if (!File.exists(path)) {
return defaults
}
var content = File.read(path)
var config = Json.parse(content)
for (key in defaults.keys) {
if (!config.containsKey(key)) {
config[key] = defaults[key]
}
}
return config
}
var config = loadConfig.call("config.json", {
"port": 8080,
"debug": false
})
System.print("Port: %(config["port"])")< / code > < / pre >
< h2 > Save JSON Configuration< / h2 >
< pre > < code > import "io" for File
import "json" for Json
var config = {
"database": "app.db",
"port": 8080,
"debug": true
}
File.write("config.json", Json.stringify(config, 2))
System.print("Configuration saved!")< / code > < / pre >
< h2 > Create Backup Copy< / h2 >
< pre > < code > import "io" for File
import "datetime" for DateTime
var backup = Fn.new { |path|
if (!File.exists(path)) {
System.print("File not found: %(path)")
return null
}
var timestamp = DateTime.now().format("\%Y\%m\%d_\%H\%M\%S")
var backupPath = "%(path).%(timestamp).bak"
File.copy(path, backupPath)
System.print("Backup created: %(backupPath)")
return backupPath
}
backup.call("important.txt")< / code > < / pre >
< h2 > Read User Input< / h2 >
< pre > < code > import "io" for Stdin
System.write("Enter your name: ")
var name = Stdin.readLine()
System.print("Hello, %(name)!")< / code > < / pre >
< h2 > Interactive Menu< / h2 >
< pre > < code > import "io" for Stdin
System.print("Select an option:")
System.print("1. Option A")
System.print("2. Option B")
System.print("3. Exit")
System.write("Choice: ")
var choice = Stdin.readLine()
if (choice == "1") {
System.print("You selected Option A")
} else if (choice == "2") {
System.print("You selected Option B")
} else if (choice == "3") {
System.print("Goodbye!")
}< / code > < / pre >
< h2 > Safe File Operations with Error Handling< / h2 >
< pre > < code > import "io" for File
var safeRead = Fn.new { |path|
var fiber = Fiber.new { File.read(path) }
var result = fiber.try()
if (fiber.error) {
System.print("Error reading %(path): %(fiber.error)")
return null
}
return result
}
var content = safeRead.call("maybe_exists.txt")
if (content) {
System.print("Content: %(content)")
}< / code > < / pre >
< h2 > Calculate Directory Size< / h2 >
< pre > < code > import "io" for File, Directory
var dirSize = Fn.new { |path|
var total = 0
var items = Directory.list(path)
for (item in items) {
var fullPath = "%(path)/%(item)"
if (Directory.exists(fullPath)) {
total = total + dirSize.call(fullPath)
} else if (File.exists(fullPath)) {
total = total + File.size(fullPath)
}
}
return total
}
var size = dirSize.call(".")
System.print("Total size: %(size) bytes")< / code > < / pre >
< div class = "admonition tip" >
< div class = "admonition-title" > See Also< / div >
feat: add async/await keywords, Num/String extensions, and Jinja markdown example
Add `async` and `await` token support to the Wren compiler with scheduler resolution logic, extend `Num` with `e` constant, hyperbolic trig, base conversion, and new methods (`isZero`, `gcd`, `lcm`, `digits`, etc.), extend `String` with `lower`, `upper`, `capitalize`, `title`, and regenerate `wren_core.wren.inc`. Include `Makefile` for multi-platform builds, rewrite `README.md` with updated build instructions, and add `example/await_demo.wren` and `example/jinja_markdown.wren` demonstrating new features.
2026-01-25 04:58:39 +01:00
< p > For full API documentation, see the < a href = "../api/io.html" > IO module reference< / a > . For object-oriented path manipulation with glob, walk, and tree operations, see the < a href = "../api/pathlib.html" > pathlib module reference< / a > .< / p >
feat: add example scripts for argparse, bytes, dataset, html, markdown, uuid, wdantic, and web chat modules
Add comprehensive demo scripts showcasing the usage of multiple Wren modules including argument parsing, byte manipulation, in-memory dataset operations, HTML encoding/slugification, markdown-to-HTML conversion, UUID generation/validation, schema validation with wdantic, and a full web chat application with REST endpoints.
2026-01-24 23:40:22 +01:00
< / div >
< / article >
< footer class = "page-footer" >
< a href = "regex-patterns.html" class = "prev" > Regex Patterns< / a >
< a href = "async-operations.html" class = "next" > Async Operations< / a >
< / footer >
< / main >
< / div >
< script src = "../js/main.js" > < / script >
< / body >
< / html >