From d76374719df1896a912648937c5f3d573bf208bc Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 7 Dec 2024 22:18:45 -0500 Subject: [PATCH] providers: Add slice functions provider --- providers/all.go | 2 ++ providers/slice/slice.go | 65 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 providers/slice/slice.go diff --git a/providers/all.go b/providers/all.go index ab22e57..edbbb03 100644 --- a/providers/all.go +++ b/providers/all.go @@ -4,6 +4,7 @@ import "git.tebibyte.media/sashakoshka/step" import fpos "git.tebibyte.media/sashakoshka/step/providers/os" import fphttp "git.tebibyte.media/sashakoshka/step/providers/http" import fppath "git.tebibyte.media/sashakoshka/step/providers/path" +import fpslice "git.tebibyte.media/sashakoshka/step/providers/slice" import fpsprig "git.tebibyte.media/sashakoshka/step/providers/sprig" import fpimport "git.tebibyte.media/sashakoshka/step/providers/import" import fpmarkdown "git.tebibyte.media/sashakoshka/step/providers/markdown" @@ -14,6 +15,7 @@ func All () []step.FuncProvider { new(fpos.Provider), new(fphttp.Provider), new(fppath.Provider), + new(fpslice.Provider), new(fpsprig.Provider), new(fpimport.Provider), fpmarkdown.Default(), diff --git a/providers/slice/slice.go b/providers/slice/slice.go new file mode 100644 index 0000000..021d82c --- /dev/null +++ b/providers/slice/slice.go @@ -0,0 +1,65 @@ +package slice + +import "fmt" +import "html/template" +import "git.tebibyte.media/sashakoshka/step" + +const hiddenPrefix = "." + +var _ step.FuncProvider = new(Provider) + +// Provider provides slice functions. +type Provider struct { + +} + +// FuncMap fulfills the step.FuncProvider interface. +func (this *Provider) FuncMap () template.FuncMap { + return template.FuncMap { + "sAppend": funcSAppend, + "iAppend": funcIAppend, + "fAppend": funcFAppend, + } +} + +func funcSAppend (slice any, addition string) []string { + switch slice := slice.(type) { + case []string: + newSlice := make([]string, len(slice) + 1) + copy(newSlice, slice) + newSlice[len(slice)] = addition + return newSlice + case string: + return []string { slice, addition } + default: + return funcSAppend(fmt.Sprint(slice), addition) + } +} + +func funcIAppend (slice any, addition int) []int { + switch slice := slice.(type) { + case []int: + newSlice := make([]int, len(slice) + 1) + copy(newSlice, slice) + newSlice[len(slice)] = addition + return newSlice + case int: + return []int { slice, addition } + default: + return funcIAppend(0, addition) + } +} + +func funcFAppend (slice any, addition float64) []float64 { + switch slice := slice.(type) { + case []float64: + newSlice := make([]float64, len(slice) + 1) + copy(newSlice, slice) + newSlice[len(slice)] = addition + return newSlice + case float64: + return []float64 { slice, addition } + default: + return funcFAppend(0, addition) + } +}