@yuneta/gobj-js 7.25.1 → 7.25.3

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,14 @@ 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: logged)
535
+ // kw_get_bool(gobj, {x: "false"}, "x", true, KW_WILD_NUMBER) → false
536
+ // kw_get_bool() logs a value that is not a boolean even without
537
+ // KW_REQUIRED ("path MUST BE a json boolean"), as the C reader does.
530
538
 
531
539
  kw_set_dict_value(gobj, kw, path, value)
532
540
  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,14 @@ 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, LOGGED ("path MUST BE a
3609
+ * json boolean", required or not) -- unless KW_WILD_NUMBER asks
3610
+ * to read a number (0 is false), a string ("true"/"false" in any
3611
+ * case, else its integer) or null (false); a list or a dict is
3612
+ * then false, logged too. Before gobj-js 7.25.2 the value went
3613
+ * through Boolean(), so "false" was TRUE; before 7.25.3 a value
3614
+ * of the wrong type gave the default back in silence.
3608
3615
  ************************************************************/
3609
3616
  function kw_get_bool(gobj, kw, path, default_value, flag) {
3610
3617
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3612,6 +3619,7 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
3612
3619
  const required = flag && flag & kw_flag_t.KW_REQUIRED;
3613
3620
  const create = flag && flag & kw_flag_t.KW_CREATE;
3614
3621
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3622
+ const wild = flag && flag & kw_flag_t.KW_WILD_NUMBER;
3615
3623
  if (b === void 0) {
3616
3624
  if (create) {
3617
3625
  let v = Boolean(default_value);
@@ -3623,8 +3631,25 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
3623
3631
  }
3624
3632
  return Boolean(default_value);
3625
3633
  }
3634
+ let value;
3635
+ if (is_boolean(b)) value = b;
3636
+ else if (wild && is_number(b)) value = b !== 0;
3637
+ else if (wild && is_string(b)) {
3638
+ if (b.toLowerCase() === "true") value = true;
3639
+ else if (b.toLowerCase() === "false") value = false;
3640
+ else value = (parseInt(b) || 0) !== 0;
3641
+ } else if (wild && b === null) value = false;
3642
+ else if (wild) {
3643
+ log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
3644
+ trace_json(kw);
3645
+ return false;
3646
+ } else {
3647
+ log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json boolean: '${path}'`);
3648
+ trace_json(kw);
3649
+ return Boolean(default_value);
3650
+ }
3626
3651
  if (extract) kw_delete(gobj, kw, path);
3627
- return Boolean(b);
3652
+ return value;
3628
3653
  }
3629
3654
  /************************************************************
3630
3655
  *
@@ -3744,7 +3769,11 @@ function kw_get_pointer(gobj, kw, path, default_value, flag) {
3744
3769
  return v;
3745
3770
  }
3746
3771
  /************************************************************
3747
- *
3772
+ * As the C kw_get_dict(): a dict found is the answer, and
3773
+ * anything else gives the default back AS GIVEN (null stays
3774
+ * null). KW_CREATE stores a dict default, never a null one.
3775
+ * Before gobj-js 7.25.2 the answer went through Object(), so a
3776
+ * null default came back as {} and a 0 as a Number object.
3748
3777
  ************************************************************/
3749
3778
  function kw_get_dict(gobj, kw, path, default_value, flag) {
3750
3779
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3753,25 +3782,25 @@ function kw_get_dict(gobj, kw, path, default_value, flag) {
3753
3782
  const create = flag && flag & kw_flag_t.KW_CREATE;
3754
3783
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3755
3784
  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) {
3785
+ if (create && is_object(default_value) && kw) {
3786
+ kw_set_dict_value(gobj, kw, path, default_value);
3787
+ return default_value;
3788
+ }
3789
+ if (required) {
3761
3790
  log_error(`path not found: '${path}'`);
3762
3791
  trace_json(kw);
3763
3792
  }
3764
- return Object(default_value);
3793
+ return default_value;
3765
3794
  }
3766
- if (extract) kw_delete(gobj, kw, path);
3767
3795
  if (!is_object(v)) {
3768
3796
  if (required) {
3769
- log_error(`path value MUST BE a dict: ${path}`);
3797
+ log_error(`${gobj_short_name(gobj)}: path value MUST BE a dict: ${path}`);
3770
3798
  trace_msg(kw);
3771
3799
  }
3772
- return Object(default_value);
3800
+ return default_value;
3773
3801
  }
3774
- return Object(v);
3802
+ if (extract) kw_delete(gobj, kw, path);
3803
+ return v;
3775
3804
  }
3776
3805
  /************************************************************
3777
3806
  *
@@ -3797,7 +3826,12 @@ function kw_get_dict_value(gobj, kw, path, default_value, flag) {
3797
3826
  return v;
3798
3827
  }
3799
3828
  /************************************************************
3800
- *
3829
+ * As the C kw_get_list(): a list found is the answer, and
3830
+ * anything else gives the default back AS GIVEN. KW_CREATE
3831
+ * stores a list default, never a null one. Before gobj-js
3832
+ * 7.25.2 the answer went through Array(), which WRAPS its
3833
+ * argument: a list found came back as [list], a default of []
3834
+ * as [[]] and a null one as [null].
3801
3835
  ************************************************************/
3802
3836
  function kw_get_list(gobj, kw, path, default_value, flag) {
3803
3837
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -3806,25 +3840,25 @@ function kw_get_list(gobj, kw, path, default_value, flag) {
3806
3840
  const create = flag && flag & kw_flag_t.KW_CREATE;
3807
3841
  const extract = flag && flag & kw_flag_t.KW_EXTRACT;
3808
3842
  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) {
3843
+ if (create && is_array(default_value) && kw) {
3844
+ kw_set_dict_value(gobj, kw, path, default_value);
3845
+ return default_value;
3846
+ }
3847
+ if (required) {
3814
3848
  log_error(`path not found: '${path}'`);
3815
3849
  trace_json(kw);
3816
3850
  }
3817
- return Array(default_value);
3851
+ return default_value;
3818
3852
  }
3819
- if (extract) kw_delete(gobj, kw, path);
3820
3853
  if (!is_array(v)) {
3821
3854
  if (required) {
3822
- log_error(`path value MUST BE an array: ${path}`);
3855
+ log_error(`${gobj_short_name(gobj)}: path value MUST BE an array: ${path}`);
3823
3856
  trace_msg(kw);
3824
3857
  }
3825
- return Array(default_value);
3858
+ return default_value;
3826
3859
  }
3827
- return Array(v);
3860
+ if (extract) kw_delete(gobj, kw, path);
3861
+ return v;
3828
3862
  }
3829
3863
  /************************************************************
3830
3864
  *
@@ -3860,7 +3894,7 @@ function kw_set_subdict_value(gobj, kw, path, key, value) {
3860
3894
  log_error("kw is not an object");
3861
3895
  return -1;
3862
3896
  }
3863
- let subdict = kw_get_dict(gobj, kw, path, {}, true, true);
3897
+ let subdict = kw_get_dict(gobj, kw, path, {}, kw_flag_t.KW_CREATE);
3864
3898
  if (!is_object(subdict)) {
3865
3899
  log_error("subdict is not an object");
3866
3900
  return -1;