Files
mesh-delivery/modules/mesh-delivery-indexer/internal/index/previews_values.go
T

76 lines
2.7 KiB
Go

package index
import (
"encoding/json"
"fmt"
"reflect"
"strings"
"git.novox.be/novox/mesh-delivery/contracts/go/clients/meshdeliverycheckerclient"
"git.novox.be/novox/mesh-delivery/contracts/go/seats/meshdeliverychecker"
"git.novox.be/novox/mesh-sdk/go/keys"
)
// A preview as the checker writes it into its state previews, read here (reads: mesh-delivery-checker.previews): the
// seat's type and the client's rules; the key is the form the seat names, `<repository>.<head>.<trunk>`, the repository
// as a key part (keys.EscapeName).
// PreviewKey is the key of a head merged onto a trunk commit.
func PreviewKey(repository, head, trunk string) (string, error) {
if err := meshdeliverycheckerclient.CheckRepository(repository); err != nil {
return "", err
}
if err := keys.CheckName("head", head); err != nil {
return "", err
}
if err := keys.CheckName("trunk commit", trunk); err != nil {
return "", err
}
return meshdeliverychecker.PreviewsByRepositoryHeadTrunkKey(keys.EscapeName(repository), head, trunk), nil
}
// ParsePreviewKey is the inverse of PreviewKey.
func ParsePreviewKey(key string) (repository, head, trunk string, err error) {
parts := strings.Split(key, ".")
if len(parts) != 3 {
return "", "", "", fmt.Errorf("index: %q is not a preview key, <repository>.<head>.<trunk>", key)
}
repository, err = keys.UnescapeName(parts[0])
if err != nil {
return "", "", "", fmt.Errorf("index: %q is not a preview key: %w", key, err)
}
if _, err := PreviewKey(repository, parts[1], parts[2]); err != nil {
return "", "", "", fmt.Errorf("index: %q is not a preview key: %w", key, err)
}
return repository, parts[1], parts[2], nil
}
// DecodePreview reads a preview.
func DecodePreview(data []byte) (meshdeliverychecker.PreviewsByRepositoryHeadTrunkValue, error) {
if err := keys.CheckVersion(data); err != nil {
return meshdeliverychecker.PreviewsByRepositoryHeadTrunkValue{}, err
}
p, err := meshdeliverychecker.DecodePreviewsByRepositoryHeadTrunkValue(data)
if err != nil {
return p, fmt.Errorf("index: a preview does not fit its shape: %w", err)
}
if err := meshdeliverycheckerclient.CheckPreview(p); err != nil {
return meshdeliverychecker.PreviewsByRepositoryHeadTrunkValue{}, err
}
return p, nil
}
// EncodePreview is p as JSON at the kept values' version (the checker writes previews; the indexer's tests do too).
func EncodePreview(p meshdeliverychecker.PreviewsByRepositoryHeadTrunkValue) ([]byte, error) {
if err := meshdeliverycheckerclient.CheckPreview(p); err != nil {
return nil, err
}
p.V = keys.Version
return json.Marshal(p)
}
// SamePreview says whether two previews are the same value.
func SamePreview(a, b meshdeliverychecker.PreviewsByRepositoryHeadTrunkValue) bool {
return reflect.DeepEqual(a, b)
}