// Copyright 2018 The Hugo Authors. All rights reserved. // // 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 commands defines and implements command-line commands and flags // used by Hugo. Commands and flags are implemented using Cobra. package commands import ( "fmt" "regexp" "github.com/gohugoio/hugo/config" "github.com/spf13/cobra" ) const ( ansiEsc = "\u001B" clearLine = "\r\033[K" hideCursor = ansiEsc + "[?25l" showCursor = ansiEsc + "[?25h" ) type flagsToConfigHandler interface { flagsToConfig(cfg config.Provider) } type cmder interface { flagsToConfigHandler getCommand() *cobra.Command } // commandError is an error used to signal different error situations in command handling. type commandError struct { s string userError bool } func (c commandError) Error() string { return c.s } func (c commandError) isUserError() bool { return c.userError } func newUserError(a ...interface{}) commandError { return commandError{s: fmt.Sprintln(a...), userError: true} } func newSystemError(a ...interface{}) commandError { return commandError{s: fmt.Sprintln(a...), userError: false} } func newSystemErrorF(format string, a ...interface{}) commandError { return commandError{s: fmt.Sprintf(format, a...), userError: false} } // Catch some of the obvious user errors from Cobra. // We don't want to show the usage message for every error. // The below may be to generic. Time will show. var userErrorRegexp = regexp.MustCompile("argument|flag|shorthand") func isUserError(err error) bool { if cErr, ok := err.(commandError); ok && cErr.isUserError() { return true } return userErrorRegexp.MatchString(err.Error()) }