mirror of
https://github.com/hauler-dev/hauler.git
synced 2026-04-07 03:07:09 +00:00
79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
package memory
|
|
|
|
import (
|
|
v1 "github.com/google/go-containerregistry/pkg/v1"
|
|
"github.com/google/go-containerregistry/pkg/v1/partial"
|
|
"github.com/google/go-containerregistry/pkg/v1/static"
|
|
"github.com/google/go-containerregistry/pkg/v1/types"
|
|
|
|
"hauler.dev/go/hauler/pkg/artifacts"
|
|
"hauler.dev/go/hauler/pkg/consts"
|
|
)
|
|
|
|
var _ artifacts.OCI = (*Memory)(nil)
|
|
|
|
// Memory implements the OCI interface for a generic set of bytes stored in memory.
|
|
type Memory struct {
|
|
blob v1.Layer
|
|
annotations map[string]string
|
|
config artifacts.Config
|
|
}
|
|
|
|
type defaultConfig struct {
|
|
MediaType string `json:"mediaType,omitempty"`
|
|
}
|
|
|
|
func NewMemory(data []byte, mt string, opts ...Option) *Memory {
|
|
blob := static.NewLayer(data, types.MediaType(mt))
|
|
|
|
cfg := defaultConfig{MediaType: consts.MemoryConfigMediaType}
|
|
m := &Memory{
|
|
blob: blob,
|
|
config: artifacts.ToConfig(cfg),
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
opt(m)
|
|
}
|
|
return m
|
|
}
|
|
|
|
func (m *Memory) MediaType() string {
|
|
return consts.OCIManifestSchema1
|
|
}
|
|
|
|
func (m *Memory) Manifest() (*v1.Manifest, error) {
|
|
layer, err := partial.Descriptor(m.blob)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
cfgDesc, err := partial.Descriptor(m.config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
manifest := &v1.Manifest{
|
|
SchemaVersion: 2,
|
|
MediaType: types.MediaType(m.MediaType()),
|
|
Config: *cfgDesc,
|
|
Layers: []v1.Descriptor{*layer},
|
|
Annotations: m.annotations,
|
|
}
|
|
|
|
return manifest, nil
|
|
}
|
|
|
|
func (m *Memory) RawConfig() ([]byte, error) {
|
|
if m.config == nil {
|
|
return []byte(`{}`), nil
|
|
}
|
|
return m.config.Raw()
|
|
}
|
|
|
|
func (m *Memory) Layers() ([]v1.Layer, error) {
|
|
var layers []v1.Layer
|
|
layers = append(layers, m.blob)
|
|
return layers, nil
|
|
}
|