nomino/gen_file.go
Dan Jones 2440f55563 ♻️ Replace HashType with Hasher
Compatible with crypto.Hash
2025-03-15 20:09:38 -05:00

75 lines
1.7 KiB
Go

package nomino
import (
"crypto"
"errors"
"fmt"
"hash"
"github.com/gosimple/slug"
)
// ErrMissingOriginal is the error returned by Slug if there is no filename
var ErrMissingOriginal = errors.New("missing original filename")
func getOriginal(c *Config) (string, error) {
if c.original == "" {
return "", ErrMissingOriginal
}
name := c.original
c.original = ""
return name, nil
}
// Slug generates a name from the original filename.
// When this is used, the original filename will be removed from the final filename.
// If a language is specified, that may affect the resulting slug.
func Slug(lang ...string) Generator {
ret := slug.Make
if len(lang) > 0 {
ret = func(in string) string {
return slug.MakeLang(in, lang[0])
}
}
return func(c *Config) (string, error) {
name, err := getOriginal(c)
return ret(name), err
}
}
// HashingFunc is a function that generates a hash.Hash
type HashingFunc func() hash.Hash
// New allows HashingFunc to be used as a Hasher
func (hf HashingFunc) New() hash.Hash {
return hf()
}
// Hasher is a type returns a hash.Hash.
// All crypto.Hash may be used.
type Hasher interface {
New() hash.Hash
}
// ErrInvalidHash is returned by the Hash generator when an invalid HashType is passed
var ErrInvalidHash = errors.New("invalid hash type")
// Hash generates a name from a hash of the filename.
// When this is used, the original filename will be removed from the final filename.
func Hash(h Hasher) Generator {
if h == nil {
h = crypto.MD5
}
return func(c *Config) (string, error) {
if h == crypto.MD5SHA1 {
return "", ErrInvalidHash
}
name, err := getOriginal(c)
if err != nil {
return "", err
}
hs := h.New()
hs.Write([]byte(name))
return fmt.Sprintf("%x", hs.Sum(nil)), nil
}
}