diff --git a/.githooks/pre-commit/01-docgen b/.githooks/pre-commit/01-docgen new file mode 100755 index 0000000..80e2506 --- /dev/null +++ b/.githooks/pre-commit/01-docgen @@ -0,0 +1,31 @@ +#!/bin/bash + +orig="${PWD}" + +if ! command -v asciidoctor &> /dev/null; +then + exit 0 +fi + +set -e + +for f in $(find . -type f -iname "README.adoc"); do + filename=$(basename -- "${f}") + docsdir=$(dirname -- "${f}") + nosuffix="${filename%.*}" + pfx="${docsdir}/${nosuffix}" + + newf="${pfx}.html" + asciidoctor -a ROOTDIR="${orig}/" -o "${newf}" "${f}" + echo "Generated ${newf} from ${f}" + git add "${newf}" + if command -v pandoc &> /dev/null; + then + newf="${pfx}.md" + asciidoctor -a ROOTDIR="${orig}/" -b docbook -o - "${f}" | pandoc -f docbook -t markdown_strict -o "${newf}" + echo "Generated ${newf} from ${f}" + git add "${newf}" + fi + cd ${orig} +done +echo "Regenerated docs" diff --git a/go.mod b/go.mod index 7158843..689b9e5 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,9 @@ module r00t2.io/goutils go 1.25 require ( + github.com/Masterminds/sprig/v3 v3.3.0 github.com/coreos/go-systemd/v22 v22.6.0 + github.com/davecgh/go-spew v1.1.1 github.com/google/uuid v1.6.0 go4.org/netipx v0.0.0-20231129151722-fdeea329fbba golang.org/x/sys v0.39.0 @@ -11,6 +13,15 @@ require ( ) require ( + dario.cat/mergo v1.0.1 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver/v3 v3.3.0 // indirect github.com/djherbis/times v1.6.0 // indirect + github.com/huandu/xstrings v1.5.0 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/shopspring/decimal v1.4.0 // indirect + github.com/spf13/cast v1.7.0 // indirect + golang.org/x/crypto v0.26.0 // indirect golang.org/x/sync v0.19.0 // indirect ) diff --git a/go.sum b/go.sum index 4a5ec2c..8a58770 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,56 @@ +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= +github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo= github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= r00t2.io/sysutils v1.15.1 h1:0EVZZAxTFqQN6jjfjqUKkXye0LMshUA5MO7l3Wd6wH8= r00t2.io/sysutils v1.15.1/go.mod h1:T0iOnaZaSG5NE1hbXTqojRZc0ia/u8TB73lV7zhMz58= diff --git a/multierr/TODO b/multierr/TODO new file mode 100644 index 0000000..aa2c34d --- /dev/null +++ b/multierr/TODO @@ -0,0 +1,21 @@ +- add unwrapping + https://go.dev/blog/go1.13-errors#the-unwrap-method +- add As method, takes a ptr to a slice of []error to return the first matching error type (errors.As) for each? + - add AsAll [][]error ptr param for multiple errors per type? + - add Map, returns map[string][]error, where key is k: + var sb strings.Builder + t = reflect.TypeOf(err) + if t.PkgPath() != "" { + sb.WriteString(t.PkgPath()) + } else { + sb.WriteString("") + } + sb.WriteString(".") + if t.Name() != "" { + sb.WriteString(t.Name()) + } else { + sb.WriteString("") + } + k = sb.String() + - support generics for similar to above? + - this might allow for "error filtering" diff --git a/netx/funcs.go b/netx/funcs.go index df43ba6..3ae6135 100644 --- a/netx/funcs.go +++ b/netx/funcs.go @@ -13,7 +13,7 @@ import ( /* AddrRfc returns an RFC-friendly string from an IP address ([net/netip.Addr]). -If addr is an IPv4 address, it will simmply be the string representation (e.g. "203.0.113.1"). +If addr is an IPv4 address, it will simply be the string representation (e.g. "203.0.113.1"). If addr is an IPv6 address, it will be enclosed in brackets (e.g. "[2001:db8::1]"). diff --git a/tplx/sprigx/README.adoc b/tplx/sprigx/README.adoc new file mode 100644 index 0000000..9b2f63b --- /dev/null +++ b/tplx/sprigx/README.adoc @@ -0,0 +1,631 @@ += SprigX +Brent Saner +Last rendered {localdatetime} +:doctype: book +:docinfo: shared +:data-uri: +:imagesdir: images +:sectlinks: +:sectnums: +:sectnumlevels: 7 +:toc: preamble +:toc2: left +:idprefix: +:toclevels: 7 +:source-highlighter: rouge +:docinfo: shared + +[id="wat"] +== What is SprigX? +SprigX are extensions to https://masterminds.github.io/sprig/[the `sprig` library^] (https://pkg.go.dev/github.com/Masterminds/sprig/v3[Go docs^]). + +They provide functions that offer more enriched use cases and domain-specific data. + +[id="use"] +== How do I Use SprigX? + +[%collapsible] +.The same way you would `sprig`! +==== +[source,go] +---- +package main + +import ( + htmlTplLib "html/template" + txtTplLib "text/template" + + "r00t2.io/goutils/tplx/sprigx" +) + +var ( + txtTpl *txtTplLib.Template = txtTplLib. + New(""). + Funcs( + sprigx.TxtFuncMap(), + ) + htmlTpl *htmlTplLib.Template = htmlTplLib. + New(""). + Funcs( + sprigx.HtmlFuncMap(), + ) +) +---- +==== + +[%collapsible] +.They can even be combined/used together. +==== +[source,go] +---- +package main + +import ( + "text/template" + + "github.com/Masterminds/sprig/v3" + "r00t2.io/goutils/tplx/sprigx" +) + +var txtTpl *template.Template = template. + New(""). + Funcs( + sprigx.TxtFuncMap(), + ). + Funcs( + sprig.TxtFuncMap(), + ) +// Or: +/* +var txtTpl *template.Template = template. + New(""). + Funcs( + sprig.TxtFuncMap(), + ). + Funcs( + sprigx.TxtFuncMap(), + ) + */ +---- +==== + +If a `