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 } }