@yuneta/gobj-js 7.25.5 → 7.25.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3563,30 +3563,46 @@
3563
3563
  return false;
3564
3564
  }
3565
3565
  /************************************************************
3566
- *
3566
+ * The value at `path` (keys joined by a backtick), as the C
3567
+ * kw_find_path() finds it: undefined when it is not there.
3568
+ * A kw that is not a dict or a list is LOGGED ("kw must be list
3569
+ * or dict") and answers undefined, as C answers NULL; so does a
3570
+ * segment in the middle of the path whose value is a scalar. A
3571
+ * middle segment that is absent or null answers undefined, logged
3572
+ * only when `verbose`. Before gobj-js 7.25.6 a bad kw answered 0,
3573
+ * which the typed readers took for a value found (kw_get_int() and
3574
+ * kw_get_real() answered 0 instead of the default, kw_get_str() and
3575
+ * kw_get_bool() logged a second line), the log named no path and
3576
+ * called gobj_short_name() on a null gobj ("gobj bad type"), and a
3577
+ * null middle segment threw a TypeError.
3567
3578
  ************************************************************/
3568
3579
  function kw_find_path(gobj, kw, path, verbose) {
3569
3580
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
3581
+ const prefix = gobj ? `${gobj_short_name(gobj)}: ` : "";
3570
3582
  if (!(is_object(kw) || is_array(kw))) {
3571
- log_error(`${gobj_short_name(gobj)}: kw must be list or dict`);
3572
- return 0;
3583
+ log_error(`${prefix}kw must be list or dict: '${String(path)}'`);
3584
+ return;
3573
3585
  }
3574
3586
  if (!is_string(path)) {
3575
- log_error(`${gobj_short_name(gobj)}: path must be a string: ${String(path)}`);
3576
- return 0;
3587
+ log_error(`${prefix}path must be a string: ${String(path)}`);
3588
+ return;
3577
3589
  }
3578
3590
  let ss = path.split("`");
3579
- if (ss.length <= 1) return kw[path];
3580
3591
  let len = ss.length;
3581
- for (let i = 0; i < len; i++) {
3582
- let key = ss[i];
3583
- kw = kw[key];
3584
- if (kw === void 0) {
3585
- if (verbose) log_error(`${gobj_short_name(gobj)}: path not found: ${String(path)}`);
3592
+ for (let i = 0; i < len - 1; i++) {
3593
+ kw = kw[ss[i]];
3594
+ if (kw === void 0 || kw === null) {
3595
+ if (verbose) log_error(`${prefix}path not found: '${path}'`);
3596
+ return;
3597
+ }
3598
+ if (!(is_object(kw) || is_array(kw))) {
3599
+ log_error(`${prefix}kw must be list or dict: '${path}'`);
3586
3600
  return;
3587
3601
  }
3588
3602
  }
3589
- return kw;
3603
+ let value = kw[ss[len - 1]];
3604
+ if (value === void 0 && verbose) log_error(`${prefix}path not found: '${path}'`);
3605
+ return value;
3590
3606
  }
3591
3607
  /************************************************************
3592
3608
  *
@@ -3627,7 +3643,7 @@
3627
3643
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3628
3644
  const wild = flag && flag & kw_flag_t.KW_WILD_NUMBER;
3629
3645
  if (b === void 0) {
3630
- if (create) {
3646
+ if (create && kw) {
3631
3647
  let v = Boolean(default_value);
3632
3648
  kw_set_dict_value(gobj, kw, path, v);
3633
3649
  return v;
@@ -3695,7 +3711,7 @@
3695
3711
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3696
3712
  const wild = flag && flag & kw_flag_t.KW_WILD_NUMBER;
3697
3713
  if (v === void 0) {
3698
- if (create) {
3714
+ if (create && kw) {
3699
3715
  let v = parseInt(default_value);
3700
3716
  kw_set_dict_value(gobj, kw, path, v);
3701
3717
  return v;
@@ -3742,7 +3758,7 @@
3742
3758
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3743
3759
  const wild = flag && flag & kw_flag_t.KW_WILD_NUMBER;
3744
3760
  if (v === void 0) {
3745
- if (create) {
3761
+ if (create && kw) {
3746
3762
  let v = Number(default_value);
3747
3763
  kw_set_dict_value(gobj, kw, path, v);
3748
3764
  return v;
@@ -3812,7 +3828,7 @@
3812
3828
  const create = flag && flag & kw_flag_t.KW_CREATE;
3813
3829
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3814
3830
  if (v === void 0) {
3815
- if (create) {
3831
+ if (create && kw) {
3816
3832
  kw_set_dict_value(gobj, kw, path, is_string(default_value) ? default_value : null);
3817
3833
  return default_value;
3818
3834
  } else if (required && !kw_path_holds_key(kw, path)) {
@@ -3965,7 +3981,12 @@
3965
3981
  let key = ss[i];
3966
3982
  if (i === len - 1) kw[key] = value;
3967
3983
  else {
3968
- if (kw[key] === void 0) kw[key] = {};
3984
+ let seg = kw[key];
3985
+ if (seg === void 0) kw[key] = {};
3986
+ else if (!is_object(seg) && !is_array(seg)) {
3987
+ log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}kw_set_dict_value(): segment '${key}' is not a dict or a list: '${path}'`);
3988
+ return -1;
3989
+ }
3969
3990
  kw = kw[key];
3970
3991
  }
3971
3992
  }