2020-01-13 09:11:56 +00:00
package cmd
import (
2020-10-27 05:45:16 +00:00
"errors"
"fmt"
2020-01-19 21:42:08 +00:00
"os"
2020-10-27 05:45:16 +00:00
"github.com/mikefarah/yq/v4/pkg/yqlib/treeops"
2020-01-13 09:11:56 +00:00
"github.com/spf13/cobra"
logging "gopkg.in/op/go-logging.v1"
)
func New ( ) * cobra . Command {
var rootCmd = & cobra . Command {
Use : "yq" ,
Short : "yq is a lightweight and portable command-line YAML processor." ,
Long : ` yq is a lightweight and portable command-line YAML processor. It aims to be the jq or sed of yaml files. ` ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
if version {
cmd . Print ( GetVersionDisplay ( ) )
return nil
}
2020-10-27 05:45:16 +00:00
if shellCompletion != "" {
switch shellCompletion {
case "bash" , "" :
return cmd . GenBashCompletion ( os . Stdout )
case "zsh" :
return cmd . GenZshCompletion ( os . Stdout )
case "fish" :
return cmd . GenFishCompletion ( os . Stdout , true )
case "powershell" :
return cmd . GenPowerShellCompletion ( os . Stdout )
default :
return fmt . Errorf ( "Unknown variant %v" , shellCompletion )
}
}
// if len(args) == 0 {
// cmd.Println(cmd.UsageString())
// return nil
// }
cmd . SilenceUsage = true
var treeCreator = treeops . NewPathTreeCreator ( )
expression := ""
if len ( args ) > 0 {
expression = args [ 0 ]
}
pathNode , err := treeCreator . ParsePath ( expression )
if err != nil {
return err
}
matchingNodes , err := evaluate ( "-" , pathNode )
if err != nil {
return err
}
2020-01-13 09:11:56 +00:00
2020-10-27 05:45:16 +00:00
if exitStatus && matchingNodes . Len ( ) == 0 {
cmd . SilenceUsage = true
return errors . New ( "No matches found" )
}
out := cmd . OutOrStdout ( )
return printResults ( matchingNodes , out )
2020-01-13 09:11:56 +00:00
} ,
PersistentPreRun : func ( cmd * cobra . Command , args [ ] string ) {
2020-09-13 01:49:55 +00:00
cmd . SetOut ( cmd . OutOrStdout ( ) )
2020-01-13 09:11:56 +00:00
var format = logging . MustStringFormatter (
` % { color}% { time:15:04:05} % { shortfunc} [% { level:.4s}]% { color:reset} % { message} ` ,
)
var backend = logging . AddModuleLevel (
logging . NewBackendFormatter ( logging . NewLogBackend ( os . Stderr , "" , 0 ) , format ) )
if verbose {
backend . SetLevel ( logging . DEBUG , "" )
} else {
backend . SetLevel ( logging . ERROR , "" )
}
logging . SetBackend ( backend )
} ,
}
rootCmd . PersistentFlags ( ) . BoolVarP ( & verbose , "verbose" , "v" , false , "verbose mode" )
2020-02-03 05:52:12 +00:00
rootCmd . PersistentFlags ( ) . BoolVarP ( & outputToJSON , "tojson" , "j" , false , "output as json. By default it prints a json document in one line, use the prettyPrint flag to print a formatted doc." )
2020-02-03 05:37:53 +00:00
rootCmd . PersistentFlags ( ) . BoolVarP ( & prettyPrint , "prettyPrint" , "P" , false , "pretty print" )
2020-02-03 05:52:12 +00:00
rootCmd . PersistentFlags ( ) . IntVarP ( & indent , "indent" , "I" , 2 , "sets indent level for output" )
2020-01-13 09:11:56 +00:00
rootCmd . Flags ( ) . BoolVarP ( & version , "version" , "V" , false , "Print version information and quit" )
2020-10-27 05:45:16 +00:00
rootCmd . Flags ( ) . StringVarP ( & shellCompletion , "shellCompletion" , "" , "" , "[bash/zsh/powershell/fish] prints shell completion script" )
rootCmd . PersistentFlags ( ) . BoolVarP ( & forceColor , "colors" , "C" , false , "force print with colors" )
rootCmd . PersistentFlags ( ) . BoolVarP ( & forceNoColor , "no-colors" , "M" , false , "force print with no colors" )
// rootCmd.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)")
rootCmd . PersistentFlags ( ) . StringVarP ( & printMode , "printMode" , "p" , "v" , "print mode (v (values, default), p (paths), pv (path and value pairs)" )
rootCmd . PersistentFlags ( ) . StringVarP ( & defaultValue , "defaultValue" , "D" , "" , "default value printed when there are no results" )
2020-01-13 09:11:56 +00:00
return rootCmd
}