mirror of
https://github.com/Luzifer/korvike.git
synced 2024-12-20 11:11:19 +00:00
Add "hash" template function
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
e18ca3f15c
commit
4083ee0cc2
3 changed files with 61 additions and 1 deletions
|
@ -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
40
functions/func_hash.go
Normal 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
|
||||
})
|
||||
}
|
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue