delivery.VersionNumbered with VersionNumberedEvent and VersionNumberedSubject is the body the builder says when it numbers a version, so a build module consumes it from mesh-sdk instead of the builder's internal package. BuildAnswer gains out-of-step, so the builder decodes a trunk build's compare by its field, not by name. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
58 lines
2.5 KiB
Go
58 lines
2.5 KiB
Go
package delivery
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
// The builder's event version.numbered (design 51 *Events of the builder*, *The floor*): said once per version the builder
|
|
// numbers, on its own family `version` (seven days), apart from its builds' ends, so a waiter on a build's end does not
|
|
// wake on it. A build module consumes it to publish a build's version with the held digest, which stores nothing.
|
|
const (
|
|
// VersionNumberedEvent is the event's local name.
|
|
VersionNumberedEvent = "version.numbered"
|
|
// VersionNumberedSubject is its subject, as a consumer's filter names it.
|
|
VersionNumberedSubject = "mesh.mod." + BuilderModule + ".event." + VersionNumberedEvent
|
|
)
|
|
|
|
// VersionNumbered is the body of VersionNumberedEvent: a numbered version of a name, the build it was numbered for, and
|
|
// what the build module needs to publish it.
|
|
type VersionNumbered struct {
|
|
// Name is the numbered name, as builder_versions lists it; Kind its artifact's kind.
|
|
Name string `json:"name"`
|
|
Kind string `json:"kind"`
|
|
Version string `json:"version"`
|
|
Tag string `json:"tag,omitempty"`
|
|
// Module and Fingerprint are the build the version was numbered for; Commit its source commit.
|
|
Module string `json:"module"`
|
|
Fingerprint string `json:"fingerprint"`
|
|
Commit string `json:"commit,omitempty"`
|
|
// Digest is the built artifact's, when the build held one; Seat the registry seat it is published through.
|
|
Digest string `json:"digest,omitempty"`
|
|
Seat string `json:"seat,omitempty"`
|
|
// Head is the head the version answers, when it answers a tag ask.
|
|
Head string `json:"head,omitempty"`
|
|
// Again is when builder_publish_again said it once more, so the bus's dedup does not drop it.
|
|
Again string `json:"again,omitempty"`
|
|
}
|
|
|
|
// EncodeVersionNumbered writes the body, refusing one that names no name, version, module or fingerprint.
|
|
func EncodeVersionNumbered(n VersionNumbered) ([]byte, error) {
|
|
if n.Name == "" || n.Version == "" || n.Module == "" || n.Fingerprint == "" {
|
|
return nil, fmt.Errorf("delivery: %s names its name, version, module and fingerprint", VersionNumberedEvent)
|
|
}
|
|
return json.Marshal(n)
|
|
}
|
|
|
|
// DecodeVersionNumbered reads the body, with the same refusal.
|
|
func DecodeVersionNumbered(data []byte) (VersionNumbered, error) {
|
|
var n VersionNumbered
|
|
if err := json.Unmarshal(data, &n); err != nil {
|
|
return VersionNumbered{}, fmt.Errorf("delivery: %s is not readable: %w", VersionNumberedEvent, err)
|
|
}
|
|
if _, err := EncodeVersionNumbered(n); err != nil {
|
|
return VersionNumbered{}, err
|
|
}
|
|
return n, nil
|
|
}
|