func (c *ConsoleCommand) Run(args []string) int { args = c.Meta.process(args, true) cmdFlags := c.Meta.flagSet("console") cmdFlags.StringVar(&c.Meta.statePath, "state", DefaultStateFilename, "path") cmdFlags.Usage = func() { c.Ui.Error(c.Help()) } if err := cmdFlags.Parse(args); err != nil { return 1 } pwd, err := os.Getwd() if err != nil { c.Ui.Error(fmt.Sprintf("Error getting pwd: %s", err)) return 1 } var configPath string args = cmdFlags.Args() if len(args) > 1 { c.Ui.Error("The console command expects at most one argument.") cmdFlags.Usage() return 1 } else if len(args) == 1 { configPath = args[0] } else { configPath = pwd } // Build the context based on the arguments given ctx, _, err := c.Context(contextOpts{ Path: configPath, PathEmptyOk: true, StatePath: c.Meta.statePath, }) if err != nil { c.Ui.Error(err.Error()) return 1 } // Setup the UI so we can output directly to stdout ui := &cli.BasicUi{ Writer: wrappedstreams.Stdout(), ErrorWriter: wrappedstreams.Stderr(), } // IO Loop session := &repl.Session{ Interpolater: ctx.Interpolater(), } // Determine if stdin is a pipe. If so, we evaluate directly. if c.StdinPiped() { return c.modePiped(session, ui) } return c.modeInteractive(session, ui) }
// getWidth impl for Unix func getWidth() int { stdoutFd := int(wrappedstreams.Stdout().Fd()) stderrFd := int(wrappedstreams.Stderr().Fd()) w := getWidthFd(stdoutFd) if w < 0 { w = getWidthFd(stderrFd) } return w }
// IsTerminal determines if this process is attached to a TTY. func IsTerminal() bool { // Windows is always a terminal if runtime.GOOS == "windows" { return true } // Same implementation as readline but with our custom fds return readline.IsTerminal(int(wrappedstreams.Stdin().Fd())) && (readline.IsTerminal(int(wrappedstreams.Stdout().Fd())) || readline.IsTerminal(int(wrappedstreams.Stderr().Fd()))) }
// Override overrides the values in readline.Config that need to be // set with wrapped values. func Override(cfg *readline.Config) *readline.Config { cfg.Stdin = wrappedstreams.Stdin() cfg.Stdout = wrappedstreams.Stdout() cfg.Stderr = wrappedstreams.Stderr() cfg.FuncGetWidth = TerminalWidth cfg.FuncIsTerminal = IsTerminal rm := RawMode{StdinFd: int(wrappedstreams.Stdin().Fd())} cfg.FuncMakeRaw = rm.Enter cfg.FuncExitRaw = rm.Exit return cfg }