diff options
| author | OpportunityLiu <[email protected]> | 2019-07-27 16:27:30 +0800 |
|---|---|---|
| committer | OpportunityLiu <[email protected]> | 2019-07-28 14:45:01 +0800 |
| commit | 5f72124406a72da23a816b73c5fa0bd5ec404e57 (patch) | |
| tree | 39e17d6064cf4b742433fe69a2e31406a0f059e4 /xmake/core/base/serialize.lua | |
| parent | bfdfbe9b260824a9254a7be7bb7ffe9f0e9cf3d5 (diff) | |
fix serialize
Diffstat (limited to 'xmake/core/base/serialize.lua')
| -rw-r--r-- | xmake/core/base/serialize.lua | 58 |
1 files changed, 34 insertions, 24 deletions
diff --git a/xmake/core/base/serialize.lua b/xmake/core/base/serialize.lua index 1a9294a09..f41b1de2f 100644 --- a/xmake/core/base/serialize.lua +++ b/xmake/core/base/serialize.lua @@ -223,6 +223,35 @@ function serialize._make(object, opt) end end +function serialize._generateindent(indent) + + -- init indent, from nil, boolean, number or string to false or string + if not indent then + -- no indent + return false + elseif type(indent) == "boolean" then -- true + -- 4 spaces + return " " + elseif type(indent) == "number" then + if indent < 0 then + return false + elseif indent > 20 then + return nil, "invalid opt.indent, too large" + else + -- indent spaces + return string.rep(" ", indent) + end + elseif type(indent) == "string" then + -- only whitespaces allowed + if not (indent:trim() == "") then + return nil, "invalid opt.indent, only whitespaces are accepted" + end + return indent + else + return nil, "invalid opt.indent, should be boolean, number or string" + end +end + -- serialize to string from the given object -- -- @param opt serialize options @@ -242,30 +271,11 @@ function serialize.save(object, opt) if opt.binary == nil then opt.binary = false end if opt.indent == nil then opt.indent = true end - -- init indent, from nil, boolean, number or string to false or string - if not opt.indent then - -- no indent - opt.indent = false - elseif type(opt.indent) == "boolean" then -- true - -- 4 spaces - opt.indent = " " - elseif type(opt.indent) == "number" then - if opt.indent < 0 then - opt.indent = false - elseif opt.indent > 20 then - return nil, "invalid opt.indent, too large" - else - -- opt.indent spaces - opt.indent = string.rep(" ", opt.indent) - end - elseif type(opt.indent) == "string" then - -- only whitespaces allowed - if not opt.indent:match("^%s+$") then - return nil, "invalid opt.indent, only whitespaces are accepted" - end - else - return nil, "invalid opt.indent, should be boolean, number or string" + local indent, ierrors = serialize._generateindent(opt.indent) + if ierrors then + return nil, ierrors end + opt.indent = indent -- make string local ok, result, errors = pcall(serialize._make, object, opt) @@ -283,7 +293,7 @@ function serialize.save(object, opt) end -- binary mode - local func, lerr = loadstring("return " .. result) + local func, lerr = loadstring("return " .. result, "=") if lerr ~= nil then return nil, lerr end |
