import Vue from 'vue'

function optionalChaining(context, path) {
  let value = context
  // foo?.bar 或 foo?[1]，以.[]分割路径
  path = path.split(/\.|\[|\]/)

  while (path.length) {
    let current = path.shift()
    // ]后面会分出一个空的，跳过
    if (current === '') continue
    // ?结尾的表示可选
    let optional = false
    if (current.endsWith('?')) {
      optional = true
      current = current.slice(0, -1)
    }
    value = value[current]
    // 遇到空值，而且是可选的，直接退出，不去取后续的部分了
    if ((typeof value === 'undefined' || value === null) && optional) {
      return
    }
  }
  return value
}

Vue.prototype.sdGet = function(context, path) {
  if (typeof path === 'undefined') {
    // 只传了一个参数，以this作为上下文
    path = context
    context = this
  }

  return optionalChaining(context, path)
}
