@yuneta/gobj-js 7.25.1 → 7.25.2

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.
package/README.md CHANGED
@@ -527,6 +527,12 @@ kw_get_str (gobj, kw, path, default_value, flag)
527
527
  kw_get_dict(gobj, kw, path, default_value, flag)
528
528
  kw_get_list(gobj, kw, path, default_value, flag)
529
529
  kw_get_dict_value(gobj, kw, path, default_value, flag)
530
+ // A typed reader answers the value when it has the reader's type, and
531
+ // the default AS GIVEN otherwise (absent key or other type), as in C:
532
+ // kw_get_list(gobj, {x: [1, 2]}, "x", [], 0) → [1, 2] (the same array)
533
+ // kw_get_dict(gobj, {}, "x", null, 0) → null
534
+ // kw_get_bool(gobj, {x: "false"}, "x", true, 0) → true (not a boolean)
535
+ // kw_get_bool(gobj, {x: "false"}, "x", true, KW_WILD_NUMBER) → false
530
536
 
531
537
  kw_set_dict_value(gobj, kw, path, value)
532
538
  kw_set_subdict_value(gobj, kw, path, key, value)
@@ -3215,8 +3215,8 @@ function trace_msg(format) {
3215
3215
  }
3216
3216
  function trace_json(jn, msg) {
3217
3217
  if (console_wants("json", msg)) {
3218
- if (msg) window.console.warn("=====> " + msg);
3219
- window.console.dir(jn);
3218
+ if (msg) _console.warn("=====> " + msg);
3219
+ _console.dir(jn);
3220
3220
  }
3221
3221
  emit_log_callback("json", jn, current_timestamp());
3222
3222
  }
@@ -3604,7 +3604,11 @@ function kw_delete(gobj, kw, path) {
3604
3604
  return 0;
3605
3605
  }
3606
3606
  /************************************************************
3607
- *
3607
+ * As the C kw_get_bool(): a boolean found is the answer, and
3608
+ * anything else gives the default back -- unless KW_WILD_NUMBER
3609
+ * asks to read a number (0 is false), a string ("true"/"false"
3610
+ * in any case, else its integer) or null (false). Before gobj-js
3611
+ * 7.25.2 the value went through Boolean(), so "false" was TRUE.
3608
3612
  ************************************************************/
3609
3613
  function kw_get_bool(gobj, kw, path, default_value, flag) {
3610
3614
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3612,6 +3616,7 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
3612
3616
  const required = flag && flag & kw_flag_t.KW_REQUIRED;
3613
3617
  const create = flag && flag & kw_flag_t.KW_CREATE;
3614
3618
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3619
+ const wild = flag && flag & kw_flag_t.KW_WILD_NUMBER;
3615
3620
  if (b === void 0) {
3616
3621
  if (create) {
3617
3622
  let v = Boolean(default_value);
@@ -3623,8 +3628,23 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
3623
3628
  }
3624
3629
  return Boolean(default_value);
3625
3630
  }
3631
+ let value;
3632
+ if (is_boolean(b)) value = b;
3633
+ else if (wild && is_number(b)) value = b !== 0;
3634
+ else if (wild && is_string(b)) {
3635
+ if (b.toLowerCase() === "true") value = true;
3636
+ else if (b.toLowerCase() === "false") value = false;
3637
+ else value = (parseInt(b) || 0) !== 0;
3638
+ } else if (wild && b === null) value = false;
3639
+ else {
3640
+ if (required) {
3641
+ log_error(`${gobj_short_name(gobj)}: path value MUST BE a boolean: ${path}`);
3642
+ trace_msg(kw);
3643
+ }
3644
+ return Boolean(default_value);
3645
+ }
3626
3646
  if (extract) kw_delete(gobj, kw, path);
3627
- return Boolean(b);
3647
+ return value;
3628
3648
  }
3629
3649
  /************************************************************
3630
3650
  *
@@ -3744,7 +3764,11 @@ function kw_get_pointer(gobj, kw, path, default_value, flag) {
3744
3764
  return v;
3745
3765
  }
3746
3766
  /************************************************************
3747
- *
3767
+ * As the C kw_get_dict(): a dict found is the answer, and
3768
+ * anything else gives the default back AS GIVEN (null stays
3769
+ * null). KW_CREATE stores a dict default, never a null one.
3770
+ * Before gobj-js 7.25.2 the answer went through Object(), so a
3771
+ * null default came back as {} and a 0 as a Number object.
3748
3772
  ************************************************************/
3749
3773
  function kw_get_dict(gobj, kw, path, default_value, flag) {
3750
3774
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3753,25 +3777,25 @@ function kw_get_dict(gobj, kw, path, default_value, flag) {
3753
3777
  const create = flag && flag & kw_flag_t.KW_CREATE;
3754
3778
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3755
3779
  if (v === void 0) {
3756
- if (create) {
3757
- let v = Object(default_value);
3758
- kw_set_dict_value(gobj, kw, path, v);
3759
- return v;
3760
- } else if (required) {
3780
+ if (create && is_object(default_value) && kw) {
3781
+ kw_set_dict_value(gobj, kw, path, default_value);
3782
+ return default_value;
3783
+ }
3784
+ if (required) {
3761
3785
  log_error(`path not found: '${path}'`);
3762
3786
  trace_json(kw);
3763
3787
  }
3764
- return Object(default_value);
3788
+ return default_value;
3765
3789
  }
3766
- if (extract) kw_delete(gobj, kw, path);
3767
3790
  if (!is_object(v)) {
3768
3791
  if (required) {
3769
- log_error(`path value MUST BE a dict: ${path}`);
3792
+ log_error(`${gobj_short_name(gobj)}: path value MUST BE a dict: ${path}`);
3770
3793
  trace_msg(kw);
3771
3794
  }
3772
- return Object(default_value);
3795
+ return default_value;
3773
3796
  }
3774
- return Object(v);
3797
+ if (extract) kw_delete(gobj, kw, path);
3798
+ return v;
3775
3799
  }
3776
3800
  /************************************************************
3777
3801
  *
@@ -3797,7 +3821,12 @@ function kw_get_dict_value(gobj, kw, path, default_value, flag) {
3797
3821
  return v;
3798
3822
  }
3799
3823
  /************************************************************
3800
- *
3824
+ * As the C kw_get_list(): a list found is the answer, and
3825
+ * anything else gives the default back AS GIVEN. KW_CREATE
3826
+ * stores a list default, never a null one. Before gobj-js
3827
+ * 7.25.2 the answer went through Array(), which WRAPS its
3828
+ * argument: a list found came back as [list], a default of []
3829
+ * as [[]] and a null one as [null].
3801
3830
  ************************************************************/
3802
3831
  function kw_get_list(gobj, kw, path, default_value, flag) {
3803
3832
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3806,25 +3835,25 @@ function kw_get_list(gobj, kw, path, default_value, flag) {
3806
3835
  const create = flag && flag & kw_flag_t.KW_CREATE;
3807
3836
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3808
3837
  if (v === void 0) {
3809
- if (create) {
3810
- let v = Array(default_value);
3811
- kw_set_dict_value(gobj, kw, path, v);
3812
- return v;
3813
- } else if (required) {
3838
+ if (create && is_array(default_value) && kw) {
3839
+ kw_set_dict_value(gobj, kw, path, default_value);
3840
+ return default_value;
3841
+ }
3842
+ if (required) {
3814
3843
  log_error(`path not found: '${path}'`);
3815
3844
  trace_json(kw);
3816
3845
  }
3817
- return Array(default_value);
3846
+ return default_value;
3818
3847
  }
3819
- if (extract) kw_delete(gobj, kw, path);
3820
3848
  if (!is_array(v)) {
3821
3849
  if (required) {
3822
- log_error(`path value MUST BE an array: ${path}`);
3850
+ log_error(`${gobj_short_name(gobj)}: path value MUST BE an array: ${path}`);
3823
3851
  trace_msg(kw);
3824
3852
  }
3825
- return Array(default_value);
3853
+ return default_value;
3826
3854
  }
3827
- return Array(v);
3855
+ if (extract) kw_delete(gobj, kw, path);
3856
+ return v;
3828
3857
  }
3829
3858
  /************************************************************
3830
3859
  *
@@ -3860,7 +3889,7 @@ function kw_set_subdict_value(gobj, kw, path, key, value) {
3860
3889
  log_error("kw is not an object");
3861
3890
  return -1;
3862
3891
  }
3863
- let subdict = kw_get_dict(gobj, kw, path, {}, true, true);
3892
+ let subdict = kw_get_dict(gobj, kw, path, {}, kw_flag_t.KW_CREATE);
3864
3893
  if (!is_object(subdict)) {
3865
3894
  log_error("subdict is not an object");
3866
3895
  return -1;