Z1maV1

args.lua

Aug 18th, 2024
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.04 KB | None | 0 0
  1. local parser = {}
  2.  
  3. function parser:new()
  4.     local obj = {
  5.         flags = {},
  6.         options = {},
  7.         parsed = {flags = {}, options = {}, args = {}}
  8.     }
  9.     self.__index = self
  10.     return setmetatable(obj, self)
  11. end
  12.  
  13. function parser:addFlag(canonical, ...)
  14.     local variants = {...}
  15.     self.flags[canonical] = {false, variants}
  16.     for _, variant in ipairs(variants) do
  17.         self.flags[variant] = {false, {canonical}}
  18.     end
  19. end
  20.  
  21. function parser:addOption(canonical, ...)
  22.     local variants = {...}
  23.     self.options[canonical] = {nil, variants}
  24.     for _, variant in ipairs(variants) do
  25.         self.options[variant] = {nil, {canonical}}
  26.     end
  27. end
  28.  
  29. function parser:parse(args)
  30.     local i = 1
  31.     while i <= #args do
  32.         local arg = args[i]
  33.         if self.flags[arg] then
  34.             for _, variant in ipairs(self.flags[arg][2]) do
  35.                 self.parsed.flags[variant] = true
  36.             end
  37.             self.parsed.flags[arg] = true
  38.         elseif self.options[arg] then
  39.             if i + 1 <= #args then
  40.                 local value = args[i + 1]
  41.                 for _, variant in ipairs(self.options[arg][2]) do
  42.                     self.parsed.options[variant] = value
  43.                 end
  44.                 self.parsed.options[arg] = value
  45.                 i = i + 1
  46.             else
  47.                 error("Option " .. arg .. " expects a value")
  48.             end
  49.         else
  50.             table.insert(self.parsed.args, arg)
  51.         end
  52.         i = i + 1
  53.     end
  54. end
  55.  
  56. function parser:getFlags()
  57.     local result = {}
  58.     for flag, _ in pairs(self.flags) do
  59.         if self.parsed.flags[flag] then
  60.             result[flag] = true
  61.         end
  62.     end
  63.     return result
  64. end
  65.  
  66. function parser:getOptions()
  67.     local result = {}
  68.     for option, _ in pairs(self.options) do
  69.         if self.parsed.options[option] then
  70.             result[option] = self.parsed.options[option]
  71.         end
  72.     end
  73.     return result
  74. end
  75.  
  76. function parser:getArgs()
  77.     return self.parsed.args
  78. end
  79.  
  80. return parser
Advertisement
Add Comment
Please, Sign In to add comment