Module yaml
The yaml module takes strings in YAML format and decodes them, or takes a series of non-YAML values and encodes them.
Below is a list of all yaml functions and members.
| Name | Use |
|---|---|
| yaml.encode() | Convert a Lua object to a YAML string |
| yaml.decode() | Convert a YAML string to a Lua object |
| __serialize parameter | Output structure specification |
| yaml.cfg() | Change configuration |
| yaml.NULL | Analog of Lua’s “nil” |
-
yaml.encode(lua_value)¶ Convert a Lua object to a YAML string.
Parameters: - lua_value – either a scalar value or a Lua table value.
Return: the original value reformatted as a YAML string.
Rtype:
-
yaml.decode(string)¶ Convert a YAML string to a Lua object.
Parameters: - string – a string formatted as YAML.
Return: the original contents formatted as a Lua table.
Rtype:
__serialize parameter:
The YAML output structure can be specified with __serialize:
'seq','sequence','array': table encoded as an array'map','mapping': table encoded as a mapfunction: the meta-method called to unpack serializable representation of table, cdata, or userdata objects
'seq' or 'map' also enable the flow (compact) mode for the YAML serializer (flow="[1,2,3]" vs block=" - 1\n - 2\n - 3\n").
Serializing 'A' and 'B' with different __serialize values brings different results:
tarantool> yaml.encode(setmetatable({'A', 'B'}, { __serialize="seq"})) --- - '["A","B"]' ... tarantool> yaml.encode(setmetatable({'A', 'B'}, { __serialize="map"})) --- - '{"1":"A","2":"B"}' ... tarantool> yaml.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="map"})}) --- - '[{"f2":"B","f1":"A"}]' ... tarantool> yaml.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="seq"})}) --- - '[[]]' ... -
yaml.cfg(table)¶ Set values affecting the behavior of encode and decode functions.
The values are all either integers or boolean
true/false.Option Default Use cfg.encode_invalid_numberstrue A flag saying whether to enable encoding of NaN and Inf numbers cfg.encode_number_precision14 Precision of floating point numbers cfg.encode_load_metatablestrue A flag saying whether the serializer will follow __serialize metatable field cfg.encode_use_tostringfalse A flag saying whether to use tostring()for unknown typescfg.encode_invalid_as_nilfalse A flag saying whether to use NULL for non-recognized types cfg.encode_sparse_converttrue A flag saying whether to handle excessively sparse arrays as maps. See detailed description below cfg.encode_sparse_ratio2 1/ encode_sparse_ratiois the permissible percentage of missing values in a sparse arraycfg.encode_sparse_safe10 A limit ensuring that small Lua arrays are always encoded as sparse arrays (instead of generating an error or encoding as map) cfg.decode_invalid_numberstrue A flag saying whether to enable decoding of NaN and Inf numbers cfg.decode_save_metatablestrue A flag saying whether to set metatables for all arrays and maps
Sparse arrays features:
During encoding, The YAML encoder tries to classify table into one of four kinds:
- Map: at least one table index is not unsigned integer.
- Regular array: all array indexes are available.
- Sparse array: at least one array index is missing.
- Excessively sparse array: the number of values missing exceeds the configured ratio.
An array is excessively sparse when all the following conditions are met:
encode_sparse_ratio> 0max(table)>encode_sparse_safemax(table)>count(table)*encode_sparse_ratio
The YAML encoder will never consider an array to be excessively sparse when encode_sparse_ratio = 0. The encode_sparse_safe limit ensures that small Lua arrays are always encoded as sparse arrays. By default, attempting to encode an excessively sparse array will generate an error. If encode_sparse_convert is set to true, excessively sparse arrays will be handled as maps.
yaml.cfg() example 1:
The following code will encode 0/0 as NaN (“not a number”) and 1/0 as Inf (“infinity”), rather than returning nil or an error message:
yaml = require('yaml') yaml.cfg{encode_invalid_numbers = true} x = 0/0 y = 1/0 yaml.encode({1, x, y, 2}) The result of the yaml.encode() request will look like this:
tarantool> yaml.encode({1, x, y, 2}) --- - '[1,nan,inf,2] ... yaml.cfg example 2:
To avoid generating errors on attempts to encode unknown data types as userdata/cdata, you can use this code:
tarantool> httpc = require('http.client').new() --- ... tarantool> yaml.encode(httpc.curl) --- - error: unsupported Lua type 'userdata' ... tarantool> yaml.encode(httpc.curl, {encode_use_tostring=true}) --- - '"userdata: 0x010a4ef2a0"' ... Note
To achieve the same effect for only one call to yaml.encode() (i.e. without changing the configuration permanently), you can use yaml.encode({1, x, y, 2}, {encode_invalid_numbers = true}).
Similar configuration settings exist for JSON and MsgPack.
-
yaml.NULL¶ A value comparable to Lua “nil” which may be useful as a placeholder in a tuple.
tarantool> yaml = require('yaml') --- ... tarantool> y = yaml.encode({'a', 1, 'b', 2}) --- ... tarantool> z = yaml.decode(y) --- ... tarantool> z[1], z[2], z[3], z[4] --- - a - 1 - b - 2 ... tarantool> if yaml.NULL == nil then print('hi') end hi --- ... The YAML collection style can be specified with __serialize:
__serialize="sequence"for a Block Sequence array,__serialize="seq"for a Flow Sequence array,__serialize="mapping"for a Block Mapping map,__serialize="map"for a Flow Mapping map.
Serializing 'A' and 'B' with different __serialize values causes different results:
tarantool> yaml = require('yaml') --- ... tarantool> print(yaml.encode(setmetatable({'A', 'B'}, { __serialize="sequence"}))) --- - A - B ... --- ... tarantool> print(yaml.encode(setmetatable({'A', 'B'}, { __serialize="seq"}))) --- ['A', 'B'] ... --- ... tarantool> print(yaml.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="map"})})) --- - {'f2': 'B', 'f1': 'A'} ... --- ...