76 lines
2.7 KiB
Go
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)
|
|
}
|