mapdata

Table of Contents

Prototype: mapdata(interpretation, pattern, array_or_container)

Return type: data

Description: Returns a data container holding a JSON array. The array is a map across each element of array_or_container, modified by a pattern. The map is either collected literally when interpretation is none or parsed as JSON when interpretation is json.

array_or_container can be a data container.

The $(this.k) and $(this.v) variables expand to the key and value of the current element, similar to the way this is available for maplist.

If the array or data container has two levels, you'll also be able to use the $(this.k[1]) variable for the key at the second level. See the example below for an illustration.

The order of the keys is not guaranteed. Use the sort function if you need order in the resulting output.

Arguments:

  • interpretation: one of
    • none
    • json
  • pattern: string, in the range: .*
  • array_or_container: string, in the range: [a-zA-Z0-9_$(){}\[\].:]+

Example:

body common control
{
      bundlesequence => { "run" };
}

bundle agent run
{
  vars:
      "myarray[lookup][big]" string => "lookup big";
      "myarray[lookup][small]" string => "lookup small";

      # every item must parse as valid JSON when the interpretation is `json`
      "mapa_json" data => mapdata("json", '{ "key": "$(this.k)", "key2": "$(this.k[1])", "value": "$(this.v)" }', myarray);
      "mapa_json_str" string => format("%S", mapa_json);

      # every item is just a string when the interpretation is `none`
      "mapa_none" data => mapdata("none", 'key=$(this.k), level 2 key = $(this.k[1]), value=$(this.v)', myarray);
      "mapa_none_str" string => format("%S", mapa_none);

      "mycontainer" data => parsejson('
{
  "top":
  {
    "x": 100,
    "y": 200
  }
}');

      # every item must parse as valid JSON when the interpretation is `json`
      "mapc_json" data => mapdata("json", '{ "key": "$(this.k)", "key2": "$(this.k[1])", "value": "$(this.v)" }', mycontainer);
      "mapc_json_str" string => format("%S", mapc_json);

      # every item is just a string when the interpretation is `none`
      "mapc_none" data => mapdata("none", 'key=$(this.k), level 2 key = $(this.k[1]), value=$(this.v)', mycontainer);
      "mapc_none_str" string => format("%S", mapc_none);

  reports:
      "mapdata/json on classic CFEngine array result: $(mapa_json_str)";
      "mapdata/none on classic CFEngine array result: $(mapa_none_str)";
      "mapdata/json on data container result: $(mapc_json_str)";
      "mapdata/none on data container result: $(mapc_none_str)";
}

Output:

R: mapdata/json on classic CFEngine array result: [{"key":"lookup","key2":"small","value":"lookup small"},{"key":"lookup","key2":"big","value":"lookup big"}]
R: mapdata/none on classic CFEngine array result: ["key=lookup, level 2 key = small, value=lookup small","key=lookup, level 2 key = big, value=lookup big"]
R: mapdata/json on data container result: [{"key":"top","key2":"x","value":"100"},{"key":"top","key2":"y","value":"200"}]
R: mapdata/none on data container result: ["key=top, level 2 key = x, value=100","key=top, level 2 key = y, value=200"]

See also: maplist(), maparray(), and data documentation.

History: Was introduced in 3.7.0