| /* |
| * Copyright 2015-2016 IBM Corporation |
| * |
| * 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 main |
| |
| import ( |
| "fmt" |
| "os" |
| "reflect" |
| goi18n "github.com/nicksnyder/go-i18n/i18n" |
| "github.com/fatih/color" |
| |
| "github.com/apache/incubator-openwhisk-client-go/whisk" |
| "github.com/apache/incubator-openwhisk-cli/commands" |
| "github.com/apache/incubator-openwhisk-cli/wski18n" |
| "github.com/mattn/go-colorable" |
| ) |
| |
| // CLI_BUILD_TIME holds the time of the CLI build. During gradle builds, |
| // this value will be overwritten via the command: |
| // go build -ldflags "-X main.CLI_BUILD_TIME=nnnnn" // nnnnn is the new timestamp |
| var CLI_BUILD_TIME string = "not set" |
| |
| var cliDebug = os.Getenv("WSK_CLI_DEBUG") // Useful for tracing init() code |
| |
| var T goi18n.TranslateFunc |
| |
| func init() { |
| if len(cliDebug) > 0 { |
| whisk.SetDebug(true) |
| } |
| |
| T = wski18n.T |
| |
| // Rest of CLI uses the Properties struct, so set the build time there |
| commands.Properties.CLIVersion = CLI_BUILD_TIME |
| } |
| |
| func main() { |
| var exitCode int = 0 |
| var displayUsage bool = false |
| var displayMsg bool = false |
| var msgDisplayed bool = true |
| var displayPrefix bool = true |
| |
| defer func() { |
| if r := recover(); r != nil { |
| fmt.Println(r) |
| fmt.Println(T("Application exited unexpectedly")) |
| } |
| }() |
| |
| if err := commands.Execute(); err != nil { |
| whisk.Debug(whisk.DbgInfo, "err object type: %s\n", reflect.TypeOf(err).String()) |
| |
| werr, isWskError := err.(*whisk.WskError) // Is the err a WskError? |
| if isWskError { |
| whisk.Debug(whisk.DbgError, "Got a *whisk.WskError error: %#v\n", werr) |
| displayUsage = werr.DisplayUsage |
| displayMsg = werr.DisplayMsg |
| msgDisplayed = werr.MsgDisplayed |
| displayPrefix = werr.DisplayPrefix |
| exitCode = werr.ExitCode |
| } else { |
| whisk.Debug(whisk.DbgError, "Got some other error: %s\n", err) |
| fmt.Fprintf(os.Stderr, "%s\n", err) |
| |
| displayUsage = false // Cobra already displayed the usage message |
| exitCode = 1; |
| } |
| |
| outputStream := colorable.NewColorableStderr() |
| |
| // If the err msg should be displayed to the console and it has not already been |
| // displayed, display it now. |
| if displayMsg && !msgDisplayed && displayPrefix && exitCode != 0 { |
| fmt.Fprintf(outputStream, "%s%s\n", color.RedString(T("error: ")), err) |
| } else if displayMsg && !msgDisplayed && !displayPrefix && exitCode != 0 { |
| fmt.Fprintf(outputStream, "%s\n", err) |
| } else if displayMsg && !msgDisplayed && exitCode == 0 { |
| fmt.Fprintf(outputStream, "%s\n", err) |
| } |
| |
| // Displays usage |
| if displayUsage { |
| fmt.Fprintf(outputStream, T("Run '{{.Name}} --help' for usage.\n", |
| map[string]interface{}{ "Name" : commands.WskCmd.CommandPath()})) |
| } |
| } |
| os.Exit(exitCode) |
| return |
| } |