Skip to main content

Go Template

Visão Geral

Go Template é a linguagem de template interna da linguagem Go utilizada pelo DHuO para referenciar e manipular dados em um fluxo de integração. A engine de template é fornecida pelo pacote text/template do Go.

As expressões de template estão disponíveis para uso em dois locais:

  • no componente Data Transformation, no campo Template, para manipulação de dados.
  • em campos de configurações de componentes que as aceitam, para utilização de valores dinâmicos. Para saber mais, acesse a documentação do componente desejado.

O contexto de execução do fluxo de integração é disponibilizado em uma estrutura chave-valor que, por sua vez, pode ser acessada por expressões de template. A sintaxe de uma expressão de template é delimitada pelos caracteres {{ e }}. A raiz do contexto pode ser acessada com a expressão {{.}} e, a partir da raiz, os demais campos da estrutura chave-valor do contexto podem ser acessados navegando pela notação de ponto. Por exemplo: {{.myComponentOut.user}} é uma expressão que acessa o campo user da saída da execução do componente myComponent, presente no contexto de execução da integração.

Informação adicional

Embora a sintaxe de expressão de template seja semelhante à sintaxe de utilização de variáveis ({{var.nome_variavel}}), templates e variáveis possuem usos e propósitos distintos. Variáveis podem ser utilizadas em qualquer campo de configuração dos componentes, inclusive em conjunto com expressões de template. Expressões de template são suportadas em campos específicos dos componentes, mas têm acesso ao contexto de execução do fluxo de integração e execução de lógicas. Para saber mais, acesse a seção Variáveis da Administração do iPaaS.

Conceitos básicos

A seguir são apresentados os principais conceitos, comumente utilizados nas expressões de templates nos componentes do DHuO. Para conceitos mais avançados e raramente utilizados, verifique a documentação do pacote text/template do Go.

Actions

As actions representam as avaliações das expressões de template, que podem conter dados simples, chamadas de funções ou execução de estruturas de controle (como condicionais e loops). Como dito anteriormente, actions são delimitadas por {{e }}. As outras partes, não delimitadas, são deixadas intactas.

Contexto de dados

Como dito anteriormente, o contexto de dados recebidos na execução do template é representado por um ponto .. Caso haja campos aninhados na estrutura do contexto é possível acessar pela sintaxe .atributo_1.atributo_2.

Atenção!

Os dados do contexto são somente leitura. Caso seja necessário inserir dados no contexto ou utilize funções que manipulam mapas chave-valor, é necessário copiar o contexto para uma variável e posteriormente manipulá-la em vez do contexto puro. Exemplo:

{{$context := .}}

Tratamento de espaços

Por padrão, todo o texto entre a execução das actions é retornado na saída quando o modelo é executado, inclusive espaços em branco e quebras de linha. No entanto, é possível tratar esse comportamento. Se o delimitador esquerdo de uma action for seguido imediatamente por um sinal de menos e um espaço em branco {{- , todo o espaço em branco à direita será cortado do texto imediatamente anterior. Da mesma forma, se o delimitador à direita for precedido por um espaço em branco e um sinal de menos -}}, todo o espaço em branco à esquerda será cortado do texto imediatamente seguinte.

Por exemplo, a expressão

{{0}} < {{1}}

será avaliada como

0 < 1

Enquanto a expressão

{{0 -}} < {{- 1}}

será avaliada como

0<1

Comentários

Comentários utilizam a sintaxe {{/* comment */}}, podendo conter os delimitadores de corte de espaços (Trim) {{- /* a comment */ -}}

Variáveis

É possível utilizar variáveis diretamente em um template, utilizando a sintaxe:

{{$nomeVariavel := valor}}

onde nomeVariavel é o nome da variável e valor pode ser um valor fixo ou resultado da chamada de uma função.

A variável pode ter seu valor atualizado utilizando a sintaxe

{{$nomeVariavel = novoValor}}

A variável pode ser utilizada em outras actions usando a sintaxe $nomeVariavel. Caso a variável armazene um mapa chave-valor, é possível acessar os campos aninhados pela sintaxe $nomeVariavel.atributo_1.atributo_n

Funções

Go Template fornece uma quantidade limitada de funções e foi projetado para ser estendido. Além das funções padrão, o DHuO utiliza a biblioteca sprig e também disponibiliza um conjunto próprio de funções customizadas. Para saber mais sobre as funções disponíveis, acesse a seção Funções.

É possível chamar funções utilizando a sintaxe:

{{nomeFuncao parametro_1 parametro_n}}

Expressões mais complexas envolvendo chamadas encadeadas podem utilizar escopos utilizando ( e ). Exemplo:

{{funcao_1 parametro_1 (funcao_2 parametro_funcao_2)}}

É possível também utilizar o operador pipe | para encadear chamadas de função. O comportamento padrão é enviar dados do lado esquerdo (pode ser um valor fixo ou resultado da chamada de uma função) para a função do lado direito. A expressão anterior pode ser reescrita utilizando pipe da seguinte forma:

{{funcao_2 parametro_funcao_2 | funcao_1 parametro_1}}

Condicionais

Para adicionar mais lógica aos templates, é possível utilizar instruções condicionais. As sintaxes mais comuns de condicionais são:

{{if expr}} T1 {{end}}
{{if expr}} T1 {{else}} T2 {{end}}
{{if expr}} T1 {{else if expr}} T2 {{end}}

onde expr é a expressão (ou variável) a ser avaliada e T1 e T2 são os blocos a serem executados.

Se o valor da expressão avaliada estiver vazio, o fluxo alternativo, se existir, será executado (T2). Caso contrário, T1 é executado. Os valores considerados vazios são: false, 0, nulo (nil) ou qualquer lista (array), mapa (chave-valor) ou string de tamanho zero.

Iterações (loops)

É possível iterar sobre listas e mapas em um template. As sintaxes mais comuns são:

{{range array_or_map}} T1 {{end}}
{{range array_or_map}} T1 {{else}} T2 {{end}}
{{range $index, $element := array_or_map}} T1 {{end}}
{{range $key, $value := array_or_map}} T1 {{end}}
{{range $varName := array_or_map}} T1 {{end}}

onde array_or_map é lista ou mapa a ser iterado e T1 e T2 são os blocos a serem executados.

Se a lista ou mapa é vazio, o fluxo alternativo, se existir, será executado (T2). Caso contrário, o contexto (.) é definido como o elemento corrente a cada iteração e disponibilizado para uso com o bloco T1 executado.

As linhas 3 e 4 representam sintaxes de iteração que armazenam os dados do índice (em caso de listas) e da chave (em caso de mapas) a cada iteração. Nesse caso, o contexto é disponibilizado nas variáveis $element/$value. A linha 5 representa uma variação das linhas 3 e 4, onde o nome da variável que armazena os dados da iteração é personalizado e os dados de índice/chave são omitidos.

É possível também, utilizar controles de iteração como {{break}} e {{continue}}, comuns em programação:

{{range array_or_map}}
{{if condition}}
{{break}}
{{end}}
{{end}}