package mill
import (
"fmt"
"tangled.org/core/spindle/db"
millv1 "tangled.org/core/spindle/mill/proto/gen"
"tangled.org/core/spindle/models"
)
func cacheBindingsToProto(bindings []models.CacheBinding) []*millv1.CacheBinding {
result := make([]*millv1.CacheBinding, len(bindings))
for i, binding := range bindings {
result[i] = &millv1.CacheBinding{
EntryIndex: uint32(binding.EntryIndex),
RestoreId: binding.RestoreID,
RestoreKey: binding.RestoreKey,
RestoreName: binding.RestoreName,
RestoreChecksum: binding.Checksum,
RestoreSizeBytes: binding.SizeBytes,
SaveId: binding.SaveID,
SaveKey: binding.SaveKey,
}
}
return result
}
func cacheCapabilities(repoDid string, bindings []models.CacheBinding) ([]db.MillCacheCapability, error) {
capabilities := make([]db.MillCacheCapability, 0, len(bindings)*2)
for _, binding := range bindings {
for _, capability := range []db.MillCacheCapability{
{Action: "restore", CacheID: binding.RestoreID, StorageKey: binding.RestoreKey},
{Action: "save", CacheID: binding.SaveID, StorageKey: binding.SaveKey},
} {
if capability.CacheID == "" && capability.StorageKey == "" {
continue
}
if capability.CacheID == "" || capability.StorageKey == "" {
return nil, fmt.Errorf("%s cache id and key must both be set", capability.Action)
}
want, err := models.CacheObjectKey(repoDid, capability.CacheID)
if err != nil {
return nil, err
}
if capability.StorageKey != want {
return nil, fmt.Errorf("%s cache key %q does not match object id", capability.Action, capability.StorageKey)
}
capabilities = append(capabilities, capability)
}
}
return capabilities, nil
}
func nixCacheToProto(grant *models.NixCacheGrant) *millv1.NixCacheGrant {
if grant == nil {
return nil
}
return &millv1.NixCacheGrant{
Cache: grant.Cache,
PublicKey: grant.PublicKey,
PullToken: grant.PullToken,
PushToken: grant.PushToken,
MaxUploadBytes: grant.MaxUploadBytes,
}
}