Payload Encoding
Payload Encoding
Section titled “Payload Encoding”Convert data between formats including JSON, MessagePack, and binary. Handle typed payloads for inter-service communication and workflow data passing.
Loading
Section titled “Loading”Global namespace. No require needed.
payload.new(...) -- direct accessFormat Constants
Section titled “Format Constants”Format identifiers for payload types:
payload.format.JSON -- "json/plain"payload.format.YAML -- "yaml/plain"payload.format.STRING -- "text/plain"payload.format.BYTES -- "application/octet-stream"payload.format.MSGPACK -- "application/msgpack"payload.format.LUA -- "lua/any"payload.format.GOLANG -- "golang/any"payload.format.ERROR -- "golang/error"Creating Payloads
Section titled “Creating Payloads”Create a new payload from a Lua value:
-- From tablelocal p = payload.new({ user_id = 123, name = "Alice", roles = {"admin", "user"}})
-- From stringlocal str_p = payload.new("Hello, World!")
-- From numberlocal num_p = payload.new(42.5)
-- From booleanlocal bool_p = payload.new(true)
-- From nillocal nil_p = payload.new(nil)
-- From errorlocal err_p = payload.new(errors.new("something failed"))| Parameter | Type | Description |
|---|---|---|
value | any | Lua value (string, number, boolean, table, nil, or error) |
Returns: Payload
Getting Format
Section titled “Getting Format”Get the payload format:
local p = payload.new({name = "test"})local format = p:get_format() -- "lua/any"
local str_p = payload.new("hello")local format2 = str_p:get_format() -- "lua/any"
local err_p = payload.new(errors.new("failed"))local format3 = err_p:get_format() -- "golang/error"Returns: string - one of payload.format.* constants
Extracting Data
Section titled “Extracting Data”Extract the Lua value from the payload (transcodes if needed):
local p = payload.new({ items = {1, 2, 3}, total = 100})
local data, err = p:data()if err then return nil, errend
print(data.total) -- 100print(data.items[1]) -- 1Returns: any, error
Transcoding Payloads
Section titled “Transcoding Payloads”Transcode payload to a different format:
local p = payload.new({ name = "test", value = 123})
-- Convert to JSONlocal json_p, err = p:transcode(payload.format.JSON)if err then return nil, errendprint(json_p:get_format()) -- "json/plain"
-- Convert to MessagePack (compact binary)local msgpack_p, err = p:transcode(payload.format.MSGPACK)if err then return nil, errend
-- Convert to YAMLlocal yaml_p, err = p:transcode(payload.format.YAML)| Parameter | Type | Description |
|---|---|---|
format | string | Target format from payload.format.* |
Returns: Payload, error
Unmarshalling
Section titled “Unmarshalling”Force-decode a payload to a Lua value, regardless of source format:
local data, err = p:unmarshal()unmarshal() always transcodes to the Lua format and returns the resulting Lua value. Unlike data(), which returns the raw underlying value (potentially a Go object for non-Lua formats), unmarshal() guarantees a fully decoded Lua value.
Returns: any, error
Async Results
Section titled “Async Results”Payloads are commonly received from async function calls:
local funcs = require("funcs")
local future, err = funcs.async("app.process:compute", input_data)if err then return nil, errend
-- Wait for resultlocal ch = future:response()local result_payload, ok = ch:receive()if not ok then return nil, errors.new("channel closed")end
-- Extract data from payloadlocal result, err = result_payload:data()if err then return nil, errend
print(result.computed_value)Errors
Section titled “Errors”| Condition | Kind | Retryable |
|---|---|---|
| Transcoding failure | errors.INTERNAL | no |
| Result not valid Lua value | errors.INTERNAL | no |
See Error Handling for working with errors.