// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package build

// Select values of Image.Type.
const (
	ImageTypeFAT        string = "fat"
	ImageTypeQEMUKernel string = "kernel"
	ImageTypeZBI        string = "zbi"
	ImageTypeVBMeta     string = "vbmeta"
	ImageTypeBlk        string = "blk"
)

// Image represents an entry in an image manifest.
type Image struct {
	// Name is the canonical name of the image.
	Name string `json:"name"`

	// CPU is the target arch this image was built for.
	CPU string `json:"cpu"`

	// Path is the path to the image within the build directory.
	Path string `json:"path"`

	// Label is the GN label of the image.
	Label string `json:"label"`

	// Type is the shorthand for the type of the image (e.g., "zbi" or "blk").
	Type string `json:"type"`

	// PaveArgs is the list of associated arguments to pass to the bootserver
	// when paving.
	PaveArgs []string `json:"bootserver_pave,omitempty"`

	// PaveZedbootArgs is the list of associated arguments to pass to the bootserver
	// when paving zedboot
	PaveZedbootArgs []string `json:"bootserver_pave_zedboot,omitempty"`

	// NetbootArgs is the list of associated arguments to pass to the bootserver
	// when netbooting.
	NetbootArgs []string `json:"bootserver_netboot,omitempty"`

	// FastbootBootArgs is the list of arguments to pass to fastboot boot.
	FastbootBootArgs []string `json:"fastboot_boot, omitempty"`

	// FastbootFlashArgs is the list of associated arguments to pass to fastboot
	// flash.
	FastbootFlashArgs []string `json:"fastboot_flash, omitempty"`
}

// ImageManifest is a JSON list of images produced by the Fuchsia build.
type ImageManifest = []Image
