yaml = require('js-yaml')
fs   = require('fs')
lang = require('../src/lang')
assert = require('assert')

exports.loadJson = (pth)->
  JSON.parse(fs.readFileSync(pth, "utf8"))

exports.loadYaml = (pth)->
  yaml.safeLoad(fs.readFileSync(pth, "utf8"))

edn = require("jsedn")

to_js = (obj)->
  if obj.constructor == edn.Map
    res = {}
    for k,idx in obj.keys
      res[k.name.replace(/^:/,'')] = to_js(obj.vals[idx])
    res
  else if obj.constructor == edn.Keyword
    obj.name
  else if obj.constructor == edn.Vector
    obj.val.map(to_js)
  else if obj.constructor == edn.Set
    obj.val.map(to_js)
  else if obj.constructor == edn.List
    ["$#{obj.val[0].name}"].concat(obj.val[1..].map(to_js))
  else if obj.constructor == edn.Symbol
    obj.name
  else
    obj

exports.loadEdn = (pth)->
  str = fs.readFileSync(pth, "utf8")
  to_js(edn.parse(str))

match_recur = (obj, sample, path)->
  if lang.isArray(sample)
    for v,i in sample
      next = obj[i]
      new_path = path.concat(i)
      if not next?
        assert(false, "No object on #{new_path.join('.')}, but #{JSON.stringify(obj)}")
      match_recur(next, v, new_path)
  else if lang.isObject(sample)
    for k,v of sample
      next = obj[k]
      new_path = path.concat(k)
      if not next?
        assert(false, "No object on #{new_path.join('.')}, but #{JSON.stringify(obj)}")
      match_recur(next, v, new_path) 
  else
    assert.equal(obj, sample, "Path #{path.join('.')}")


exports.match = (obj, sample)->
  match_recur(obj, sample, [])