1
0
Fork 0
mirror of https://github.com/Luzifer/korvike.git synced 2024-11-08 15:30:05 +00:00

Add "hash" template function

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2021-04-11 23:45:58 +02:00
parent e18ca3f15c
commit 4083ee0cc2
Signed by: luzifer
GPG key ID: 0066F03ED215AD7D
3 changed files with 61 additions and 1 deletions

View file

@ -35,10 +35,16 @@
$ echo '{{ file "hello" }}' | korvike
Hello World
```
- `{{ hash <algo> <string> }}`
Hash string with given algorithm (supported algorithms: md5, sha1, sha256, sha512)
```console
$ echo '{{ hash "sha256" "this is a test" }}' | korvike
2e99758548972a8e8822ad47fa1017ff72f06f3ff6a016851f45c398732bc50c
```
- `{{ markdown <source> }}`
Format the source using a markdown parser
```console
$ echo '{{ markdown "# headline" | korvike }}'
$ echo '{{ markdown "# headline" }}' | korvike
<h1>headline</h1>
```
- `{{ now <format string> }}`

40
functions/func_hash.go Normal file
View file

@ -0,0 +1,40 @@
package functions
import (
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"errors"
"fmt"
"hash"
)
func init() {
registerFunction("hash", func(name string, v ...string) (string, error) {
if len(v) < 1 {
return "", errors.New("no string to hash")
}
var hash hash.Hash
switch name {
case "md5":
hash = md5.New()
case "sha1":
hash = sha1.New()
case "sha256":
hash = sha256.New()
case "sha512":
hash = sha512.New()
default:
return "", fmt.Errorf("hash algo %q not supported", name)
}
if _, err := hash.Write([]byte(v[0])); err != nil {
return "", fmt.Errorf("writing to hash: %w", err)
}
return fmt.Sprintf("%x", hash.Sum(nil)), nil
})
}

View file

@ -73,6 +73,20 @@ func Test_file(t *testing.T) {
}
}
func Test_hash(t *testing.T) {
input := "I'm a string to hash"
for algo, exp := range map[string]string{
"md5": "d5adddaa0fd9f924b85e7874dc85f814",
"sha1": "bd41599338445f401b8d3751fbe718e8a0b52004",
"sha256": "ba32f090baf28862816a10da05509b31393704184ae49c68f9eb2933afa9e4d1",
"sha512": "3288edcff4f28526fe8ecfb6d5182f2a446ab0572550c9591d1f5cacd377397af25c0274c9c2428c35422d215ccdc304d0353c093c76e750f9d7c4d54e64eed8",
} {
if res := renderHelper(fmt.Sprintf("{{ hash %q %q }}", algo, input), nil); res != exp {
t.Errorf("Hash algo %q yield unexpected result: exp=%q res=%q", algo, exp, res)
}
}
}
func Test_now(t *testing.T) {
if _, err := time.Parse(time.RFC3339Nano, renderHelper(fmt.Sprintf("{{now %q}}", time.RFC3339Nano), nil)); err != nil {
t.Errorf("[now] did not produce expected time format")