<#--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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
    http://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.
-->
<#import "/freemarker-generator/lib/commons-csv.ftl" as csv />
<#assign dataSource = dataSources[0]>
<#assign csvParser = tools.csv.parse(dataSource, csv.sourceFormat())>
<#assign headers = (csvParser.getHeaderMap()!{})?keys>
<#assign records = csvParser.records>
<#--------------------------------------------------------------------------->
<#compress>
    <@writeHeaders headers/>
    <@writeColums records/>
</#compress>
<#--------------------------------------------------------------------------->
<#macro writeHeaders headers>
    <#if headers?has_content>
        || ${headers?join(" || ", "")} ||
    </#if>
</#macro>
<#--------------------------------------------------------------------------->
<#macro writeColums columns>
    <#if columns?has_content>
        <#list columns as column>
            | ${column.iterator()?join(" | ", "")} |
        </#list>
    </#if>
</#macro>