https://github.com/arran4/go-template-functional-operations
These functions enable a more functional programming style within template rendering, allowing you to easily perform operations like mapping, filtering, and finding indices directly within your templates.
https://github.com/arran4/go-template-functional-operations
functional-go-template go go-template go-template-functions golang
Last synced: 3 months ago
JSON representation
These functions enable a more functional programming style within template rendering, allowing you to easily perform operations like mapping, filtering, and finding indices directly within your templates.
- Host: GitHub
- URL: https://github.com/arran4/go-template-functional-operations
- Owner: arran4
- License: mit
- Created: 2023-08-07T05:48:06.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2023-08-07T07:53:39.000Z (almost 2 years ago)
- Last Synced: 2025-01-13T18:24:35.669Z (5 months ago)
- Topics: functional-go-template, go, go-template, go-template-functions, golang
- Language: Go
- Homepage:
- Size: 25.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
# Go Template Function Operations
The goal of this library is to quickly add some reflection based functional functions to the `text/template` and
`html/template` language. Namely:
* `map`
* `filter`
* `find`
* `findIndex`This library exists in lieu of generic support in `text/template` or `html/template`.
# Exported functions:
* `func MapTemplateFunc(slice any, f any) (any, error)` The map function.
* `func FilterTemplateFunc(slice any, f any) (any, error)` The map function.
* `func TextFunctions() text/template.FuncMap`
* `func HtmlFunctions() html/template.FuncMap`# Template Function definitions
[interface.go](interface.go):
```go
func TextFunctions() tt.FuncMap {
return map[string]any{
"filter": FilterTemplateFunc,
"find": FindTemplateFunc,
"findIndex": FindIndexTemplateFunc,
"map": MapTemplateFunc,
}
}func HtmlFunctions() ht.FuncMap {
return map[string]any{
"filter": FilterTemplateFunc,
"find": FindTemplateFunc,
"findIndex": FindIndexTemplateFunc,
"map": MapTemplateFunc,
}
}
```## `map`
In go: `MapTemplateFunc`, provided as `map` by `TextFunctions` and `HtmlFunctions`
Definition:
```
func MapTemplateFunc(slice any, f any) (any, error)
```* The first argument `slice` must be a slice (or nil), of any type.
* Second argument `f` must be a function of these definitions:
* `func () any`
* `func () (any, error)`
* `func (v any) any`
* `func (v any) (any, error)`The return will be:
* The first result: an array of the same length as `slice` in the case, or nil if there was an error. The output of `f` will be in the appropriate place for each value
* The 2nd result: an error if there was an error: See [errors.go](errors.go) for a complete list.Usage:
* `{{ map $.Data $.Funcs.inc }}`
* `{{ map $.Data $.Funcs.odd }}`## `filter`
In go: `FilterTemplateFunc`, provided as `filter` by `TextFunctions` and `HtmlFunctions`
Definition:
```
func FilterTemplateFunc(slice any, f any) (any, error)
```* The first argument `slice` must be a slice (or nil), of any type.
* Second argument `f` must be a function of these definitions:
* `func () bool`
* `func () (bool, error)`
* `func (v any) bool`
* `func (v any) (bool, error)`The return will be:
* The first result: an array of the same length or smaller as `slice` in the case, or nil if there was an error.
The output of `f` will be a slice which only contains the values which `f` returned true for `slice`
* The 2nd result: an error if there was an error: See [errors.go](errors.go) for a complete list.Usage:
* `{{ filter $.Data $.Funcs.odd }}`## `find`
In go: `FindTemplateFunc`, provided as `find` by `TextFunctions` and `HtmlFunctions`
Definition:
```
func FindTemplateFunc(slice any, f any) (any, error)
```* The first argument `slice` must be a slice (or nil), of any type.
* Second argument `f` must be a function of these definitions:
* `func () bool`
* `func () (bool, error)`
* `func (v any) bool`
* `func (v any) (bool, error)`The return will be:
* The first matching value, or nil
* The 2nd result: an error if there was an error: See [errors.go](errors.go) for a complete list.Usage:
* `{{ filter $.Data $.Funcs.odd }}`## `findIndex`
In go: `FindIndexTemplateFunc`, provided as `findIndex` by `TextFunctions` and `HtmlFunctions`
Definition:
```
func FindIndexTemplateFunc(slice any, f any) (int, error)
```* The first argument `slice` must be a slice (or nil), of any type.
* Second argument `f` must be a function of these definitions:
* `func () bool`
* `func () (bool, error)`
* `func (v any) bool`
* `func (v any) (bool, error)`The return will be:
* The first matching index, or -1
* The 2nd result: an error if there was an error: See [errors.go](errors.go) for a complete list.Usage:
* `{{ filter $.Data $.Funcs.odd }}`# Usage:
```go
package mainimport (
"fmt"
"github.com/arran4/go-template-functional-operations"
"github.com/arran4/go-template-functional-operations/misc"
"os"
"text/template"
)func main() {
funcs := map[string]any{
"inc": func(i int) int {
return i + 1
},
"odd": func(i int) bool {
return i%2 == 1
},
}
funcs = misc.MergeMaps(funtemplates.TextFunctions(), funcs)tmpl := template.Must(template.New("").Funcs(funcs).Parse(`
{{ map $.Data $.Funcs.inc }}
{{ map $.Data $.Funcs.odd }}
`))data := struct {
Data []int
Funcs map[string]any
}{
Data: []int{1, 2, 3, 4},
Funcs: funcs,
}err := tmpl.Execute(os.Stdout, data)
if err != nil {
fmt.Println(err)
}
}
```Returns:
```[2 3 4 5]
[true false true false]
```