blob: c9c1b1140a370b9a8cbe16835312ef7bc105d362 [file] [log] [blame]
// Copyright 2018 The CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package tool defines statefull operation types for cue commands.
//
// This package is only visible in cue files with a _tool.cue or _tool_test.cue
// ending.
//
// CUE configuration files are not influenced by and do not influence anything
// outside the configuration itself: they are hermetic. Tools solve
// two problems: allow outside values such as environment variables,
// file or web contents, random generators etc. to influence configuration,
// and allow configuration to be actionable from within the tooling itself.
// Separating these concerns makes it clear to user when outside influences are
// in play and the tool definition can be strict about what is allowed.
//
// Tools are defined in files ending with _tool.cue. These files have a
// top-level map, "command", which defines all the tools made available through
// the cue command.
//
//
package tool
// A Command specifies a user-defined command.
Command: {
//
// Example:
// mycmd [-n] names
usage?: string
// short is short description of what the command does.
short?: string
// long is a longer description that spans multiple lines and
// likely contain examples of usage of the command.
long?: string
// A var defines a value that can be set by the command line or an
// environment variable.
//
// Example:
// var fast: {
// description: "run faster than anyone"
// value: true | bool
// }
//
var <name>: {
value: _
description: "" | string
}
// tasks specifies the list of things to do to run command. Tasks are
// typically underspecified and completed by the particular internal
// handler that is running them. Task de
tasks <name>: Task
// TODO:
// timeout?: number // in seconds
}
// A task defines a step in the execution of a command, server, or fix
// operation.
Task: {
kind: =~#"\."#
}
// import "cue/tool"
//
// command <Name>: { // from "cue/tool".Command
// // usage gives a short usage pattern of the command.
// // Example:
// // fmt [-n] [-x] [packages]
// usage: Name | string
//
// // short gives a brief on-line description of the command.
// // Example:
// // reformat package sources
// short: "" | string
//
// // long gives a detailed description of the command, including a
// // description of flags usage and examples.
// long: "" | string
//
// // A task defines a single action to be run as part of this command.
// // Each task can have inputs and outputs, depending on the type
// // task. The outputs are initially unspecified, but are filled out
// // by the tooling
// //
// task <Name>: { // from "cue/tool".Task
// // supported fields depend on type
// }
//
// VarValue = string | bool | int | float | [...string|int|float]
//
// // var declares values that can be set by command line flags or
// // environment variables.
// //
// // Example:
// // // environment to run in
// // var env: "test" | "prod"
// // The tool would print documentation of this flag as:
// // Flags:
// // --env string environment to run in: test(default) or prod
// var <Name>: VarValue
//
// // flag defines a command line flag.
// //
// // Example:
// // var env: "test" | "prod"
// //
// // // augment the flag information for var
// // flag env: {
// // shortFlag: "e"
// // description: "environment to run in"
// // }
// //
// // The tool would print documentation of this flag as:
// // Flags:
// // -e, --env string environment to run in: test(default), staging, or prod
// //
// flag <Name>: { // from "cue/tool".Flag
// // value defines the possible values for this flag.
// // The default is string. Users can define default values by
// // using disjunctions.
// value: env[Name].value | VarValue
//
// // name, if set, allows var to be set with the command-line flag
// // of the given name. null disables the command line flag.
// name: Name | null | string
//
// // short defines an abbreviated version of the flag.
// // Disabled by default.
// short: null | string
// }
//
// // populate flag with the default values for
// flag: { "\(k)": { value: v } | null for k, v in var }
//
// // env defines environment variables. It is populated with values
// // for var.
// //
// // To specify a var without an equivalent environment variable,
// // either specify it as a flag directly or disable the equally
// // named env entry explicitly:
// //
// // var foo: string
// // env foo: null // don't use environment variables for foo
// //
// env <Name>: {å
// // name defines the environment variable that sets this flag.
// name: "CUE_VAR_" + strings.Upper(Name) | string | null
//
// // The value retrieved from the environment variable or null
// // if not set.
// value: null | string | bytes
// }
// env: { "\(k)": { value: v } | null for k, v in var }
// }
//