model_parser.lua 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. local string = string
  2. local table = table
  3. local io = io
  4. local lyaml = require("lyaml")
  5. local M = {}
  6. -- Parameters that do not get inherited.
  7. local NO_INHERIT = {abstract = true}
  8. local MODEL_PATH = "./config/model/typedef/"
  9. local function camel2snake(src)
  10. return src:lower()
  11. :gsub("^pas:", "") -- Strip namespace.
  12. :gsub("([^^])(%u)", "%1_%2") -- Uppercase (except initial) to _.
  13. end
  14. M.parse_model = function(mod_id)
  15. local hierarchy = {}
  16. local function traverse(mod_id)
  17. print("traversing:", mod_id)
  18. local fname = camel2snake (mod_id)
  19. local fh = assert(io.open(MODEL_PATH .. fname .. ".yml"), "r")
  20. local yml_data = fh:read("a")
  21. fh:close()
  22. local model = lyaml.load(yml_data)
  23. model.id = mod_id
  24. --print("Model: ")
  25. --for k, v in pairs(model) do print (k, v) end
  26. -- Prepend to hierarchy.
  27. table.insert(hierarchy, 1, model)
  28. if model.broader then traverse(model.broader) end
  29. end
  30. traverse(mod_id)
  31. local lineage = {} -- Config ID lineage, from ancestor to leaf.
  32. for _, mod in ipairs(hierarchy) do table.insert(lineage, mod.id) end
  33. --[[
  34. for k, v in ipairs(hierarchy) do
  35. for kk, vv in pairs(v) do print(k, kk, vv) end
  36. end
  37. --]]
  38. local function merge(src, dest)
  39. for k, v in pairs(src) do
  40. if NO_INHERIT[k] then goto continue end
  41. if type(v) == "table" then
  42. dest[k] = dest[k] or {}
  43. assert(type(dest[k]) == "table")
  44. merge(v, dest[k])
  45. else
  46. dest[k] = v
  47. end
  48. ::continue::
  49. end
  50. end
  51. local config = {}
  52. for _, src_config in ipairs(hierarchy) do
  53. merge(src_config, config)
  54. end
  55. return config
  56. end
  57. return M