package main

import "time"

// This type represents the rootfs-key of the Docker image config.
// It specifies the digest (i.e. usually SHA256 hash) of the tar'ed, but NOT
// compressed image layers.
type RootFs struct {
	// The digests of the non-compressed FS layers.
	DiffIds []string `json:"diff_ids"`

	// Type should always be set to "layers"
	Type string `json:"type"`
}

// This type represents an entry in the Docker image config's history key.
// Every history element "belongs" to a filesystem layer.
type History struct {
	Created   time.Time `json:"created"`
	CreatedBy string    `json:"created_by"`
}

// This type represents runtime-configuration for the Docker image.
// A lot of possible keys are omitted here, see:
// https://github.com/docker/docker/blob/master/image/spec/v1.2.md#image-json-description
type ImageConfig struct {
	Cmd []string
	Env []string
}

// This type represents the Docker image configuration
type Config struct {
	Created time.Time `json:"created"`
	Author  string    `json:"author"`

	// Architecture should be "amd64"
	Architecture string `json:"architecture"`

	// OS should be "linux"
	Os string `json:"os"`

	// Configuration can be set to 'nil', in which case all options have to be
	// supplied at container launch time.
	Config *ImageConfig `json:"config"`

	// Filesystem layers and history elements have to be in the same order.
	RootFs  RootFs    `json:"rootfs"`
	History []History `json:"history"`
}

// This type represents any manifest
type Element struct {
	MediaType string `json:"mediaType"`
	Size      int    `json:"size"`
	Digest    string `json:"digest"`
}

// This type represents a Docker image manifest as used by the registry
// protocol V2.
type Manifest struct {
	SchemaVersion int       `json:"schemaVersion"` // Must be 2
	MediaType     string    `json:"mediaType"`     // Use ManifestMediaType const
	Config        Element   `json:"config"`
	Layers        []Element `json:"layers"`
}

// A really "dumb" representation of an image, with its data blob and related
// metadata.
// Note: This is not a registry API type.
type Image struct {
	Layer       []byte
	LayerDigest string

	Manifest       []byte
	ManifestDigest string

	Config       []byte
	ConfigDigest string
}