14bf54857SBaptiste Daroussin## Module `ucl` 24bf54857SBaptiste Daroussin 34bf54857SBaptiste DaroussinThis lua module allows to parse objects from strings and to store data into 44bf54857SBaptiste Daroussinucl objects. It uses `libucl` C library to parse and manipulate with ucl objects. 54bf54857SBaptiste Daroussin 64bf54857SBaptiste DaroussinExample: 74bf54857SBaptiste Daroussin 84bf54857SBaptiste Daroussin~~~lua 94bf54857SBaptiste Daroussinlocal ucl = require("ucl") 104bf54857SBaptiste Daroussin 114bf54857SBaptiste Daroussinlocal parser = ucl.parser() 124bf54857SBaptiste Daroussinlocal res,err = parser:parse_string('{key=value}') 134bf54857SBaptiste Daroussin 144bf54857SBaptiste Daroussinif not res then 154bf54857SBaptiste Daroussin print('parser error: ' .. err) 164bf54857SBaptiste Daroussinelse 174bf54857SBaptiste Daroussin local obj = parser:get_object() 184bf54857SBaptiste Daroussin local got = ucl.to_format(obj, 'json') 1939ee7a7aSBaptiste Daroussinend 204bf54857SBaptiste Daroussin 214bf54857SBaptiste Daroussinlocal table = { 224bf54857SBaptiste Daroussin str = 'value', 234bf54857SBaptiste Daroussin num = 100500, 244bf54857SBaptiste Daroussin null = ucl.null, 254bf54857SBaptiste Daroussin func = function () 264bf54857SBaptiste Daroussin return 'huh' 274bf54857SBaptiste Daroussin end 2839ee7a7aSBaptiste Daroussin} 294bf54857SBaptiste Daroussin 304bf54857SBaptiste Daroussin 314bf54857SBaptiste Daroussinprint(ucl.to_format(table, 'ucl')) 324bf54857SBaptiste Daroussin-- Output: 334bf54857SBaptiste Daroussin--[[ 344bf54857SBaptiste Daroussinnum = 100500; 354bf54857SBaptiste Daroussinstr = "value"; 364bf54857SBaptiste Daroussinnull = null; 374bf54857SBaptiste Daroussinfunc = "huh"; 384bf54857SBaptiste Daroussin--]] 394bf54857SBaptiste Daroussin~~~ 404bf54857SBaptiste Daroussin 414bf54857SBaptiste Daroussin###Brief content: 424bf54857SBaptiste Daroussin 434bf54857SBaptiste Daroussin**Functions**: 444bf54857SBaptiste Daroussin 454bf54857SBaptiste Daroussin> [`ucl_object_push_lua(L, obj, allow_array)`](#function-ucl_object_push_lual-obj-allow_array) 464bf54857SBaptiste Daroussin 474bf54857SBaptiste Daroussin> [`ucl.to_format(var, format)`](#function-uclto_formatvar-format) 484bf54857SBaptiste Daroussin 494bf54857SBaptiste Daroussin 504bf54857SBaptiste Daroussin 514bf54857SBaptiste Daroussin**Methods**: 524bf54857SBaptiste Daroussin 534bf54857SBaptiste Daroussin> [`parser:parse_file(name)`](#method-parserparse_filename) 544bf54857SBaptiste Daroussin 554bf54857SBaptiste Daroussin> [`parser:parse_string(input)`](#method-parserparse_stringinput) 564bf54857SBaptiste Daroussin 574bf54857SBaptiste Daroussin> [`parser:get_object()`](#method-parserget_object) 584bf54857SBaptiste Daroussin 594bf54857SBaptiste Daroussin 604bf54857SBaptiste Daroussin## Functions 614bf54857SBaptiste Daroussin 624bf54857SBaptiste DaroussinThe module `ucl` defines the following functions. 634bf54857SBaptiste Daroussin 644bf54857SBaptiste Daroussin### Function `ucl_object_push_lua(L, obj, allow_array)` 654bf54857SBaptiste Daroussin 664bf54857SBaptiste DaroussinThis is a `C` function to push `UCL` object as lua variable. This function 674bf54857SBaptiste Daroussinconverts `obj` to lua representation using the following conversions: 684bf54857SBaptiste Daroussin 694bf54857SBaptiste Daroussin- *scalar* values are directly presented by lua objects 704bf54857SBaptiste Daroussin- *userdata* values are converted to lua function objects using `LUA_REGISTRYINDEX`, 714bf54857SBaptiste Daroussinthis can be used to pass functions from lua to c and vice-versa 72*a0409676SBaptiste Daroussin- *arrays* are converted to lua tables with numeric indices suitable for `ipairs` iterations 73*a0409676SBaptiste Daroussin- *objects* are converted to lua tables with string indices 744bf54857SBaptiste Daroussin 754bf54857SBaptiste Daroussin**Parameters:** 764bf54857SBaptiste Daroussin 774bf54857SBaptiste Daroussin- `L {lua_State}`: lua state pointer 784bf54857SBaptiste Daroussin- `obj {ucl_object_t}`: object to push 794bf54857SBaptiste Daroussin- `allow_array {bool}`: expand implicit arrays (should be true for all but partial arrays) 804bf54857SBaptiste Daroussin 814bf54857SBaptiste Daroussin**Returns:** 824bf54857SBaptiste Daroussin 834bf54857SBaptiste Daroussin- `{int}`: `1` if an object is pushed to lua 844bf54857SBaptiste Daroussin 854bf54857SBaptiste DaroussinBack to [module description](#module-ucl). 864bf54857SBaptiste Daroussin 874bf54857SBaptiste Daroussin### Function `ucl.to_format(var, format)` 884bf54857SBaptiste Daroussin 894bf54857SBaptiste DaroussinConverts lua variable `var` to the specified `format`. Formats supported are: 904bf54857SBaptiste Daroussin 914bf54857SBaptiste Daroussin- `json` - fine printed json 924bf54857SBaptiste Daroussin- `json-compact` - compacted json 934bf54857SBaptiste Daroussin- `config` - fine printed configuration 944bf54857SBaptiste Daroussin- `ucl` - same as `config` 954bf54857SBaptiste Daroussin- `yaml` - embedded yaml 964bf54857SBaptiste Daroussin 974bf54857SBaptiste DaroussinIf `var` contains function, they are called during output formatting and if 984bf54857SBaptiste Daroussinthey return string value, then this value is used for ouptut. 994bf54857SBaptiste Daroussin 1004bf54857SBaptiste Daroussin**Parameters:** 1014bf54857SBaptiste Daroussin 1024bf54857SBaptiste Daroussin- `var {variant}`: any sort of lua variable (if userdata then metafield `__to_ucl` is searched for output) 1034bf54857SBaptiste Daroussin- `format {string}`: any available format 1044bf54857SBaptiste Daroussin 1054bf54857SBaptiste Daroussin**Returns:** 1064bf54857SBaptiste Daroussin 1074bf54857SBaptiste Daroussin- `{string}`: string representation of `var` in the specific `format`. 1084bf54857SBaptiste Daroussin 1094bf54857SBaptiste DaroussinExample: 1104bf54857SBaptiste Daroussin 1114bf54857SBaptiste Daroussin~~~lua 1124bf54857SBaptiste Daroussinlocal table = { 1134bf54857SBaptiste Daroussin str = 'value', 1144bf54857SBaptiste Daroussin num = 100500, 1154bf54857SBaptiste Daroussin null = ucl.null, 1164bf54857SBaptiste Daroussin func = function () 1174bf54857SBaptiste Daroussin return 'huh' 1184bf54857SBaptiste Daroussin end 11939ee7a7aSBaptiste Daroussin} 1204bf54857SBaptiste Daroussin 1214bf54857SBaptiste Daroussin 1224bf54857SBaptiste Daroussinprint(ucl.to_format(table, 'ucl')) 1234bf54857SBaptiste Daroussin-- Output: 1244bf54857SBaptiste Daroussin--[[ 1254bf54857SBaptiste Daroussinnum = 100500; 1264bf54857SBaptiste Daroussinstr = "value"; 1274bf54857SBaptiste Daroussinnull = null; 1284bf54857SBaptiste Daroussinfunc = "huh"; 1294bf54857SBaptiste Daroussin--]] 1304bf54857SBaptiste Daroussin~~~ 1314bf54857SBaptiste Daroussin 1324bf54857SBaptiste DaroussinBack to [module description](#module-ucl). 1334bf54857SBaptiste Daroussin 1344bf54857SBaptiste Daroussin 1354bf54857SBaptiste Daroussin## Methods 1364bf54857SBaptiste Daroussin 1374bf54857SBaptiste DaroussinThe module `ucl` defines the following methods. 1384bf54857SBaptiste Daroussin 1394bf54857SBaptiste Daroussin### Method `parser:parse_file(name)` 1404bf54857SBaptiste Daroussin 1414bf54857SBaptiste DaroussinParse UCL object from file. 1424bf54857SBaptiste Daroussin 1434bf54857SBaptiste Daroussin**Parameters:** 1444bf54857SBaptiste Daroussin 1454bf54857SBaptiste Daroussin- `name {string}`: filename to parse 1464bf54857SBaptiste Daroussin 1474bf54857SBaptiste Daroussin**Returns:** 1484bf54857SBaptiste Daroussin 1494bf54857SBaptiste Daroussin- `{bool[, string]}`: if res is `true` then file has been parsed successfully, otherwise an error string is also returned 1504bf54857SBaptiste Daroussin 1514bf54857SBaptiste DaroussinExample: 1524bf54857SBaptiste Daroussin 1534bf54857SBaptiste Daroussin~~~lua 1544bf54857SBaptiste Daroussinlocal parser = ucl.parser() 1554bf54857SBaptiste Daroussinlocal res,err = parser:parse_file('/some/file.conf') 1564bf54857SBaptiste Daroussin 1574bf54857SBaptiste Daroussinif not res then 1584bf54857SBaptiste Daroussin print('parser error: ' .. err) 1594bf54857SBaptiste Daroussinelse 1604bf54857SBaptiste Daroussin -- Do something with object 1614bf54857SBaptiste Daroussinend 1624bf54857SBaptiste Daroussin~~~ 1634bf54857SBaptiste Daroussin 1644bf54857SBaptiste DaroussinBack to [module description](#module-ucl). 1654bf54857SBaptiste Daroussin 1664bf54857SBaptiste Daroussin### Method `parser:parse_string(input)` 1674bf54857SBaptiste Daroussin 1684bf54857SBaptiste DaroussinParse UCL object from file. 1694bf54857SBaptiste Daroussin 1704bf54857SBaptiste Daroussin**Parameters:** 1714bf54857SBaptiste Daroussin 1724bf54857SBaptiste Daroussin- `input {string}`: string to parse 1734bf54857SBaptiste Daroussin 1744bf54857SBaptiste Daroussin**Returns:** 1754bf54857SBaptiste Daroussin 1764bf54857SBaptiste Daroussin- `{bool[, string]}`: if res is `true` then file has been parsed successfully, otherwise an error string is also returned 1774bf54857SBaptiste Daroussin 1784bf54857SBaptiste DaroussinBack to [module description](#module-ucl). 1794bf54857SBaptiste Daroussin 1804bf54857SBaptiste Daroussin### Method `parser:get_object()` 1814bf54857SBaptiste Daroussin 1824bf54857SBaptiste DaroussinGet top object from parser and export it to lua representation. 1834bf54857SBaptiste Daroussin 1844bf54857SBaptiste Daroussin**Parameters:** 1854bf54857SBaptiste Daroussin 1864bf54857SBaptiste Daroussin nothing 1874bf54857SBaptiste Daroussin 1884bf54857SBaptiste Daroussin**Returns:** 1894bf54857SBaptiste Daroussin 1904bf54857SBaptiste Daroussin- `{variant or nil}`: ucl object as lua native variable 1914bf54857SBaptiste Daroussin 1924bf54857SBaptiste DaroussinBack to [module description](#module-ucl). 1934bf54857SBaptiste Daroussin 1944bf54857SBaptiste Daroussin 1954bf54857SBaptiste DaroussinBack to [top](#). 1964bf54857SBaptiste Daroussin 197