hub/internal/domain/algorithm.go

78 lines
1.6 KiB
Go

package domain
import (
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"errors"
"fmt"
"hash"
"source.toby3d.me/toby3d/hub/internal/common"
)
type Algorithm struct {
algorithm string
}
var (
AlgorithmUnd = Algorithm{algorithm: ""} // "und"
AlgorithmSHA1 = Algorithm{algorithm: "sha1"} // "sha1"
AlgorithmSHA256 = Algorithm{algorithm: "sha256"} // "sha256"
AlgorithmSHA384 = Algorithm{algorithm: "sha384"} // "sha384"
AlgorithmSHA512 = Algorithm{algorithm: "sha512"} // "sha512"
)
var ErrSyntaxAlgorithm = errors.New("bad algorithm syntax")
var stringsAlgorithms = map[string]Algorithm{
AlgorithmSHA1.algorithm: AlgorithmSHA1,
AlgorithmSHA256.algorithm: AlgorithmSHA256,
AlgorithmSHA384.algorithm: AlgorithmSHA384,
AlgorithmSHA512.algorithm: AlgorithmSHA512,
}
func ParseAlgorithm(algorithm string) (Algorithm, error) {
if alg, ok := stringsAlgorithms[algorithm]; ok {
return alg, nil
}
return AlgorithmUnd, fmt.Errorf("%w: %s", ErrSyntaxAlgorithm, algorithm)
}
func (a Algorithm) Hash() hash.Hash {
switch a {
default:
return nil
case AlgorithmSHA1:
return sha1.New()
case AlgorithmSHA256:
return sha256.New()
case AlgorithmSHA384:
return sha512.New384()
case AlgorithmSHA512:
return sha512.New()
}
}
func (a *Algorithm) UnmarshalForm(src []byte) error {
var err error
if *a, err = ParseAlgorithm(string(src)); err != nil {
return fmt.Errorf("Algorithm: %w", err)
}
return nil
}
func (a Algorithm) String() string {
if a.algorithm != "" {
return a.algorithm
}
return common.Und
}
func (a Algorithm) GoString() string {
return "domain.Algorithm(" + a.String() + ")"
}