// Package profile contains implementation and internal interfaces and
// types used by the implementation of Veyron profiles.
package profile

import "veyron.io/veyron/veyron2/services/mgmt/build"

// Library describes a shared library that applications may use.
type Library struct {
	// Name is the name of the library.
	Name         string
	// MajorVersion is the major version of the library.
	MajorVersion string
	// MinorVersion is the minor version of the library.
	MinorVersion string
}

// Specification is how we represent a profile internally. It should
// provide enough information to allow matching of binaries to nodes.
type Specification struct {
	// Arch is the target hardware architecture of the profile.
	Arch        build.Architecture
	// Description is a human-friendly description of the profile.
	Description string
	// Format is the file format supported by the profile.
	Format      build.Format
	// Libraries is a set of libraries the profile requires.
	Libraries   set[Library]
	// Label is a human-friendly concise label for the profile,
	// e.g. "linux-media".
	Label       string
	// OS is the target operating system of the profile.
	OS          build.OperatingSystem
}
