Skip to content

Build a CLI Tool

Build a command-line tool with argument parsing, file I/O, and error handling.

The Tool: Line Counter

wyn
var file = Args.get("file")
var verbose = Args.has("verbose")

if file == "" {
    println("Usage: linecount --file <path> [--verbose]")
} else {
    if !File.exists(file) {
        Log.error("file not found: " + file)
    } else {
        var content = File.read(file)
        var lines = content.lines()
        var count = lines.len()

        if verbose {
            for i in 0..count {
                println("${i}: ${lines}"[i])
            }
        }

        println("${count} lines")
    }
}

Build and Run

sh
wyn build linecount.wyn -o linecount
./linecount --file main.wyn --verbose

Add More Features

Word count

wyn
var words = 0
for line in lines {
    words = words + line.words().len()
}
println("${words} words")

JSON output

wyn
if Args.has("json") {
    println("{\"lines\": " ${count} + ", \"words\": " ${words} + "}")
}

Multiple files

wyn
var files = Args.positional()
var total = 0
for f in files {
    var content = File.read(f)
    var n = content.lines().len()
    println(f + ": " ${n})
    total = total + n
}
println("total: " ${total})

MIT License