1// Copyright 2017 The OPA Authors.  All rights reserved.
2// Use of this source code is governed by an Apache2
3// license that can be found in the LICENSE file.
4
5package cmd
6
7import (
8	"fmt"
9
10	"github.com/spf13/pflag"
11
12	"github.com/open-policy-agent/opa/ast"
13	"github.com/open-policy-agent/opa/util"
14)
15
16func addFailFlag(fs *pflag.FlagSet, fail *bool, value bool) {
17	fs.BoolVarP(fail, "fail", "", value, "exits with non-zero exit code on undefined/empty result and errors")
18}
19
20func addDataFlag(fs *pflag.FlagSet, paths *repeatedStringFlag) {
21	fs.VarP(paths, "data", "d", "set data file(s) or directory path(s)")
22}
23
24func addBundleFlag(fs *pflag.FlagSet, paths *repeatedStringFlag) {
25	fs.VarP(paths, "bundle", "b", "set bundle file(s) or directory path(s)")
26}
27
28func addInputFlag(fs *pflag.FlagSet, inputPath *string) {
29	fs.StringVarP(inputPath, "input", "i", "", "set input file path")
30}
31
32func addImportFlag(fs *pflag.FlagSet, imports *repeatedStringFlag) {
33	fs.VarP(imports, "import", "", "set query import(s)")
34}
35
36func addPackageFlag(fs *pflag.FlagSet, pkg *string) {
37	fs.StringVarP(pkg, "package", "", "", "set query package")
38}
39
40func addQueryStdinFlag(fs *pflag.FlagSet, stdin *bool) {
41	fs.BoolVarP(stdin, "stdin", "", false, "read query from stdin")
42}
43
44func addInputStdinFlag(fs *pflag.FlagSet, stdinInput *bool) {
45	fs.BoolVarP(stdinInput, "stdin-input", "I", false, "read input document from stdin")
46}
47
48func addMetricsFlag(fs *pflag.FlagSet, metrics *bool, value bool) {
49	fs.BoolVarP(metrics, "metrics", "", value, "report query performance metrics")
50}
51
52func addOutputFormat(fs *pflag.FlagSet, outputFormat *util.EnumFlag) {
53	fs.VarP(outputFormat, "format", "f", "set output format")
54}
55
56func addBenchmemFlag(fs *pflag.FlagSet, benchMem *bool, value bool) {
57	fs.BoolVar(benchMem, "benchmem", value, "report memory allocations with benchmark results")
58}
59
60func addCountFlag(fs *pflag.FlagSet, count *int, cmdType string) {
61	fs.IntVar(count, "count", 1, fmt.Sprintf("number of times to repeat each %s (default 1)", cmdType))
62}
63
64func addMaxErrorsFlag(fs *pflag.FlagSet, errLimit *int) {
65	fs.IntVarP(errLimit, "max-errors", "m", ast.CompileErrorLimitDefault, "set the number of errors to allow before compilation fails early")
66}
67
68func addIgnoreFlag(fs *pflag.FlagSet, ignoreNames *[]string) {
69	fs.StringSliceVarP(ignoreNames, "ignore", "", []string{}, "set file and directory names to ignore during loading (e.g., '.*' excludes hidden files)")
70}
71
72const (
73	explainModeOff   = "off"
74	explainModeFull  = "full"
75	explainModeNotes = "notes"
76	explainModeFails = "fails"
77)
78
79func newExplainFlag(modes []string) *util.EnumFlag {
80	return util.NewEnumFlag(modes[0], modes)
81}
82
83func setExplainFlag(fs *pflag.FlagSet, explain *util.EnumFlag) {
84	fs.VarP(explain, "explain", "", "enable query explanations")
85}
86