-- O `.zip` do Infra as Code: exatamente rustploy.yml + rustploy.vars.toml na
-- raiz. Sobre `zip_write`/`zip_read` do motor; o formato é do Rustploy.
-- Nomes das duas entradas que o export grava na raiz do zip.
local YML_ENTRY = "rustploy.yml"
local TOML_ENTRY = "rustploy.vars.toml"
local function write(path: string, yaml: string, toml: string): (boolean, string?)
return zip_write(path, {
{ name = YML_ENTRY, text = yaml },
{ name = TOML_ENTRY, text = toml },
})
end
-- Valida e lê o zip importado: exatamente um .yml/.yaml e um .toml, na raiz, e
-- nada mais. `{ ok = true, yaml, toml }` ou `{ ok = false, error }`.
local function read(path: string): any
local zip = zip_read(path)
if not zip.ok then
return { ok = false, error = zip.error }
end
local yaml: string? = nil
local toml: string? = nil
local extras: { string } = {}
for _, entry in ipairs(zip.entries or {}) do
local lower = string.lower(entry.name)
local is_yaml = string.sub(lower, -4) == ".yml" or string.sub(lower, -5) == ".yaml"
local is_toml = string.sub(lower, -5) == ".toml"
if entry.dir or string.find(entry.name, "/", 1, true) or (not is_yaml and not is_toml) then
table.insert(extras, entry.name)
elseif entry.text == nil then
return { ok = false, error = entry.name .. " não é texto UTF-8 válido" }
elseif is_yaml then
if yaml ~= nil then
return { ok = false, error = "o zip tem mais de um arquivo .yml" }
end
yaml = entry.text
else
if toml ~= nil then
return { ok = false, error = "o zip tem mais de um arquivo .toml" }
end
toml = entry.text
end
end
if #extras > 0 then
return { ok = false, error = "o zip só pode ter um .yml e um .toml — sobrou: " .. table.concat(extras, ", ") }
end
if yaml == nil then
return { ok = false, error = "o zip não tem um arquivo .yml" }
end
if toml == nil then
return { ok = false, error = "o zip não tem um arquivo .toml" }
end
return { ok = true, yaml = yaml, toml = toml }
end
return { write = write, read = read }