7  Files and Data I/O

Tactus provides small, sandbox-friendly file and serialization helpers for common workflows.

7.1 File

local text = File.read("README.md")
File.write("out.txt", "hello")
local ok = File.exists("out.txt")

7.2 Json

local s = Json.encode({a = 1, b = {"x", "y"}})
local t = Json.decode(s)

7.3 Filesystem Helper Module (tactus.io.fs)

Use the stdlib filesystem helper when you need directory listing and globs:

local fs = require("tactus.io.fs")

local entries = fs.list_dir("chapters", {files_only = true, sort = true})
local qmd_files = fs.glob("chapters/*.qmd", {sort = true})

7.3.1 Determinism Note

Directory contents can change between runs. For durable workflows, wrap enumeration and reads:

local fs = require("tactus.io.fs")

local files = Step.checkpoint(function()
  return fs.glob("docs/*.md", {sort = true})
end)

7.4 Quick Patterns

7.4.1 Build a Small Index

local fs = require("tactus.io.fs")

local index = Step.checkpoint(function()
  local files = fs.glob("docs/*.md", {sort = true})
  local out = {}
  for _, path in ipairs(files) do
    out[path] = File.read(path)
  end
  return out
end)

7.4.2 Structured Output as JSON

Procedure {
  output = {result = field.object{required = true}},
  function(input)
    local result = {ok = true, message = "done"}
    return {result = result}
  end
}