# Payload _Path: en/lua/data/payload_ ## Table of Contents - Payload Encoding ## Content # Payload Encoding Convert data between formats including JSON, MessagePack, and binary. Handle typed payloads for inter-service communication and workflow data passing. ## Loading Global namespace. No require needed. ```lua payload.new(...) -- direct access ``` ## Format Constants Format identifiers for payload types: ```lua 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 Create a new payload from a Lua value: ```lua -- From table local p = payload.new({ user_id = 123, name = "Alice", roles = {"admin", "user"} }) -- From string local str_p = payload.new("Hello, World!") -- From number local num_p = payload.new(42.5) -- From boolean local bool_p = payload.new(true) -- From nil local nil_p = payload.new(nil) -- From error local err_p = payload.new(errors.new("something failed")) ``` | Parameter | Type | Description | |-----------|------|-------------| | `value` | any | Lua value (string, number, boolean, table, nil, or error) | **Returns:** `Payload, nil` ## Getting Format Get the payload format: ```lua 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, nil` - one of `payload.format.*` constants ## Extracting Data Extract the Lua value from the payload (transcodes if needed): ```lua local p = payload.new({ items = {1, 2, 3}, total = 100 }) local data, err = p:data() if err then return nil, err end print(data.total) -- 100 print(data.items[1]) -- 1 ``` **Returns:** `any, error` ## Transcoding Payloads Transcode payload to a different format: ```lua local p = payload.new({ name = "test", value = 123 }) -- Convert to JSON local json_p, err = p:transcode(payload.format.JSON) if err then return nil, err end print(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, err end -- Convert to YAML local yaml_p, err = p:transcode(payload.format.YAML) ``` | Parameter | Type | Description | |-----------|------|-------------| | `format` | string | Target format from `payload.format.*` | **Returns:** `Payload, error` ## Async Results Payloads are commonly received from async function calls: ```lua local funcs = require("funcs") local future, err = funcs.async("app.process:compute", input_data) if err then return nil, err end -- Wait for result local ch = future:response() local result_payload, ok = ch:receive() if not ok then return nil, errors.new("channel closed") end -- Extract data from payload local result, err = result_payload:data() if err then return nil, err end print(result.computed_value) ``` ## Errors | Condition | Kind | Retryable | |-----------|------|-----------| | Transcoding failure | `errors.INTERNAL` | no | | Result not valid Lua value | `errors.INTERNAL` | no | See [Error Handling](lua/core/errors.md) for working with errors. ## Navigation Previous: Compress (lua/data/compress) Next: Excel (lua/data/excel)