types/model: remove Digest
The Digest type in its current form is awkward to work with and presents challenges with regard to how it serializes via String using the '-' prefix. We currently only use this in ollama.com, so we'll move our specific needs around digest parsing and validation there.
This commit is contained in:
parent
21adf8b6d2
commit
380e06e5be
2 changed files with 0 additions and 89 deletions
|
@ -4,7 +4,6 @@ package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"cmp"
|
"cmp"
|
||||||
"encoding/hex"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
@ -371,57 +370,3 @@ func cutPromised(s, sep string) (before, after string, ok bool) {
|
||||||
}
|
}
|
||||||
return cmp.Or(before, MissingPart), cmp.Or(after, MissingPart), true
|
return cmp.Or(before, MissingPart), cmp.Or(after, MissingPart), true
|
||||||
}
|
}
|
||||||
|
|
||||||
type DigestType byte
|
|
||||||
|
|
||||||
const (
|
|
||||||
DigestTypeInvalid DigestType = iota
|
|
||||||
DigestTypeSHA256
|
|
||||||
)
|
|
||||||
|
|
||||||
func (t DigestType) String() string {
|
|
||||||
switch t {
|
|
||||||
case DigestTypeSHA256:
|
|
||||||
return "sha256"
|
|
||||||
default:
|
|
||||||
return "invalid"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Digest struct {
|
|
||||||
Type DigestType
|
|
||||||
Sum [32]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func ParseDigest(s string) (Digest, error) {
|
|
||||||
i := strings.IndexAny(s, "-:")
|
|
||||||
if i < 0 {
|
|
||||||
return Digest{}, fmt.Errorf("invalid digest %q", s)
|
|
||||||
}
|
|
||||||
typ, encSum := s[:i], s[i+1:]
|
|
||||||
if typ != "sha256" {
|
|
||||||
return Digest{}, fmt.Errorf("unsupported digest type %q", typ)
|
|
||||||
}
|
|
||||||
d := Digest{
|
|
||||||
Type: DigestTypeSHA256,
|
|
||||||
}
|
|
||||||
n, err := hex.Decode(d.Sum[:], []byte(encSum))
|
|
||||||
if err != nil {
|
|
||||||
return Digest{}, err
|
|
||||||
}
|
|
||||||
if n != 32 {
|
|
||||||
return Digest{}, fmt.Errorf("digest %q decoded to %d bytes; want 32", encSum, n)
|
|
||||||
}
|
|
||||||
return d, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d Digest) String() string {
|
|
||||||
if d.Type == DigestTypeInvalid {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("sha256-%x", d.Sum)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d Digest) IsValid() bool {
|
|
||||||
return d.Type != DigestTypeInvalid
|
|
||||||
}
|
|
||||||
|
|
|
@ -284,40 +284,6 @@ func TestFilepathAllocs(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
validSha256 = "sha256-1000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
validSha256Old = "sha256:1000000000000000000000000000000000000000000000000000000000000000"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestParseDigest(t *testing.T) {
|
|
||||||
cases := []struct {
|
|
||||||
in string
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{"", ""}, // empty
|
|
||||||
{"sha123-12", ""}, // invalid type
|
|
||||||
{"sha256-", ""}, // invalid sum
|
|
||||||
{"sha256-123", ""}, // invalid odd length sum
|
|
||||||
|
|
||||||
{validSha256, validSha256},
|
|
||||||
{validSha256Old, validSha256},
|
|
||||||
}
|
|
||||||
for _, tt := range cases {
|
|
||||||
t.Run(tt.in, func(t *testing.T) {
|
|
||||||
got, err := ParseDigest(tt.in)
|
|
||||||
if err != nil {
|
|
||||||
if tt.want != "" {
|
|
||||||
t.Errorf("parseDigest(%q) = %v; want %v", tt.in, err, tt.want)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if got.String() != tt.want {
|
|
||||||
t.Errorf("parseDigest(%q).String() = %q; want %q", tt.in, got, tt.want)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestParseNameFromFilepath(t *testing.T) {
|
func TestParseNameFromFilepath(t *testing.T) {
|
||||||
cases := map[string]Name{
|
cases := map[string]Name{
|
||||||
filepath.Join("host", "namespace", "model", "tag"): {Host: "host", Namespace: "namespace", Model: "model", Tag: "tag"},
|
filepath.Join("host", "namespace", "model", "tag"): {Host: "host", Namespace: "namespace", Model: "model", Tag: "tag"},
|
||||||
|
|
Loading…
Reference in a new issue