#+begin_src prep
#@ ```
#@ printf "one\ntwo\nthree\n" > /tmp/list.txt
#@ printf "1\n2\n3\n"        >> /tmp/list.txt
#@ printf "1.0\n2.0\n3.0"    >> /tmp/list.txt
#@ ```
#+end_src
###############################################################################
#+begin_src cfengine3
bundle agent example_function_return_types
# @brief Example showing function return types
{
  classes:
    "this_file_exists" expression => fileexists($(this.promise_filename));

  vars:
    "my_string"
      string => concat("Promises you cannot keep", " are no better than lies");

    "my_list_of_strings"
      slist => readstringlist(
        "/tmp/list.txt", # File to read
        "", # Don't ignore any lines
        "\n", # Split on newlines
        inf, # Extract as many entries as possible
        inf
      ); # Read in as much data as possible
    "my_list_of_integers"
      ilist => readintlist(
        "/tmp/list.txt", # File to read
        "^(\D+)|(\d+[^\n]+)", # Ignore any lines that are not integers
        "\n", # Split on newlines
        inf, # Maximum number of entries
        inf
      ); # Maximum number of bytes to read
    "my_list_of_reals"
      rlist => readreallist(
        "/tmp/list.txt", # File to read
        "^(\D+)", # Ignore any lines that are not digits
        "\n", # Split on newlines
        inf, # Maximum number of entries
        inf
      ); # Maximum number of bytes to read
    "my_integer" int => string_length($(my_string));
    "my_real" real => sum(my_list_of_integers);
    "my_data" data => mergedata('{ "Hello": "world!" }');

  reports:
    "my_string: '$(my_string)'";
    "my_list_of_strings includes '$(my_list_of_strings)'";
    "my_list_of_integers includes '$(my_list_of_integers)'";
    "my_list_of_reals includes '$(my_list_of_reals)'";
    "my_integer: '$(my_integer)'";
    "my_real: '$(my_real)'";
    "my_data: '$(with)'" with => string_mustache("{{%-top-}}", my_data);

    this_file_exists::
      "This file exists.";
}

bundle agent __main__
{
  methods:
    "example_function_return_types";
}

#+end_src
#+begin_src example_output
#@ ```
#@ R: my_string: 'Promises you cannot keep are no better than lies'
#@ R: my_list_of_strings includes 'one'
#@ R: my_list_of_strings includes 'two'
#@ R: my_list_of_strings includes 'three'
#@ R: my_list_of_strings includes '1'
#@ R: my_list_of_strings includes '2'
#@ R: my_list_of_strings includes '3'
#@ R: my_list_of_strings includes '1.0'
#@ R: my_list_of_strings includes '2.0'
#@ R: my_list_of_strings includes '3.0'
#@ R: my_list_of_integers includes '1'
#@ R: my_list_of_integers includes '2'
#@ R: my_list_of_integers includes '3'
#@ R: my_list_of_reals includes '1'
#@ R: my_list_of_reals includes '2'
#@ R: my_list_of_reals includes '3'
#@ R: my_list_of_reals includes '1.0'
#@ R: my_list_of_reals includes '2.0'
#@ R: my_list_of_reals includes '3.0'
#@ R: my_integer: '48'
#@ R: my_real: '6.000000'
#@ R: my_data: '{
#@   "Hello": "world!"
#@ }'
#@ R: This file exists.
#@ ```
#+end_src
