{#
Copyright 2021 The Pigweed Authors

Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy of
the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under
the License.
#}
{% for code in code_items %}
{% set index = loop.index if show_index else '' %}
{% set prompt_indent_text = '... ' %}
{% set input_text = code.input if code.input else '' %}

>>> {{ input_text|indent(width=prompt_indent_text) }}
{% if code.stdout -%}
  {{ code.stdout }}
{%- endif %}
{% if code.stderr -%}
  {{ code.stderr }}
{%- endif %}
{% if code.is_running %}
Running...
{% endif %}
{% if code.exception_text %}
{{ code.exception_text }}
{% elif code.result_object %}
{{ result_format(code.result_object) }}
{% elif code.output %}
{{ code.output }}
{% endif %}
{% endfor -%}
