Streams

Operações de leitura/escrita de stream para manipular dados eficientemente. Objetos stream sao obtidos de outros modulos (HTTP, filesystem, etc.).

Carregamento

-- De corpo de requisição HTTP
local stream = req:stream()

-- De filesystem
local fs = require("fs")
local stream = fs.get("app:data"):open("/file.txt", "r")

Leitura

local chunk, err = stream:read(size)
Parâmetro Tipo Descrição
size integer Bytes para ler (0 = ler tudo disponível)

Retorna: string, error - nil em EOF

-- Ler todos os dados restantes
local data, err = stream:read_all()

Escrita

local bytes, err = stream:write(data)
Parâmetro Tipo Descrição
data string Dados para escrever

Retorna: integer, error - bytes escritos

Seeking

local pos, err = stream:seek(whence, offset)
Parâmetro Tipo Descrição
whence string "set", "cur" ou "end"
offset integer Offset em bytes

Retorna: integer, error - nova posicao

Flushing

local ok, err = stream:flush()

Flush de dados em buffer para armazenamento subjacente.

Informacoes do Stream

local info, err = stream:stat()
Campo Tipo Descrição
size integer Tamanho total (-1 se desconhecido)
position integer Posicao atual
readable boolean Pode ler
writable boolean Pode escrever
seekable boolean Pode fazer seek

Fechando

local ok, err = stream:close()

Fechar stream e liberar recursos. Seguro chamar multiplas vezes.

Scanner

Criar um tokenizador para conteudo do stream:

local scanner, err = stream:scanner(split)
Parâmetro Tipo Descrição
split string "lines", "words", "bytes", "runes"

Métodos do Scanner

local has_more = scanner:scan()  -- Avancar para proximo token
local token = scanner:text()      -- Obter token atual
local err_msg = scanner:err()     -- Obter erro se houver
while scanner:scan() do
    local line = scanner:text()
    process(line)
end
if scanner:err() then
    return nil, errors.new("INTERNAL", scanner:err())
end

Erros

Condição Tipo
Tipo whence/split inválido INVALID
Stream fechado INTERNAL
Não legivel/gravavel INTERNAL
Falha de leitura/escrita INTERNAL