diff options
| author | Colin Wilk <colin@wilk.cx> | 2026-10-30 10:04:02 +0100 |
|---|---|---|
| committer | Colin Wilk <colin@wilk.cx> | 2026-10-30 10:07:43 +0100 |
| commit | b03b00869391cd70ef1e40561f72dffbd2f47b29 (patch) | |
| tree | fd1941854bea58ec464b81ac8b0d8627cbed2e74 /registry/models.go | |
| download | cr-web-b03b00869391cd70ef1e40561f72dffbd2f47b29.tar.gz cr-web-b03b00869391cd70ef1e40561f72dffbd2f47b29.zip | |
Initial Commit
Diffstat (limited to 'registry/models.go')
| -rw-r--r-- | registry/models.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/registry/models.go b/registry/models.go new file mode 100644 index 0000000..11e1db8 --- /dev/null +++ b/registry/models.go @@ -0,0 +1,75 @@ +// Package registry is responsible for fetching data from the backend registry +// and providing the data for the UI components. +package registry + +import ( + "context" + "errors" + "time" +) + +// ErrNotFound should be returned for missing repositories/manifests. +var ErrNotFound = errors.New("registry resource not found") + +type Provider interface { + Repositories(ctx context.Context) ([]Repository, error) + Repository(ctx context.Context, name string) (Repository, error) + Manifest(ctx context.Context, repository, digest string) (Manifest, error) +} + +type Repository struct { + Name string `json:"name"` + UpdatedAt time.Time `json:"updated_at"` + Age string `json:"age,omitempty"` + Tags []Tag `json:"tags"` +} + +type Tag struct { + Name string `json:"name"` + Aliases []string `json:"aliases,omitempty"` + UpdatedAt time.Time `json:"updated_at"` + Age string `json:"age,omitempty"` + Platforms string `json:"platforms,omitempty"` + SizeBytes int64 `json:"size_bytes,omitempty"` + ManifestDigest string `json:"manifest_digest"` +} + +type Manifest struct { + Repository string `json:"repository"` + Digest string `json:"digest"` + Kind string `json:"kind"` // "index" for a list; "image" for layers. + SizeBytes int64 `json:"size_bytes,omitempty"` // Registry-reported image total, when available. + Tags []TagReference `json:"tags"` + Platforms []PlatformManifest `json:"platforms,omitempty"` + Layers []Layer `json:"layers,omitempty"` +} + +func (m Manifest) TotalSizeBytes() int64 { + if m.SizeBytes > 0 { + return m.SizeBytes + } + var total int64 + for _, layer := range m.Layers { + total += layer.SizeBytes + } + return total +} + +type TagReference struct { + Name string `json:"name"` + UpdatedAt time.Time `json:"updated_at"` + Age string `json:"age,omitempty"` + ManifestDigest string `json:"manifest_digest"` +} + +type PlatformManifest struct { + Platform string `json:"platform"` + Variant string `json:"variant,omitempty"` + SizeBytes int64 `json:"size_bytes"` + Digest string `json:"digest"` +} + +type Layer struct { + Digest string `json:"digest"` + SizeBytes int64 `json:"size_bytes"` +} |