package cli import ( "bufio" "fmt" "os" "reflect" "github.com/alecthomas/kong" ) var _ kong.Mapper = (*PasswordMapper)(nil) type PasswordMapper struct { } func (p PasswordMapper) Decode(ctx *kong.DecodeContext, target reflect.Value) error { token := ctx.Scan.Pop() switch v := token.Value.(type) { case []byte: target.SetBytes(v) case string: if len(v) == 0 { return nil } if v == "-" { scanner := bufio.NewScanner(os.Stdin) if scanner.Scan() { target.SetBytes(scanner.Bytes()) return nil } else { return fmt.Errorf("failed to read password from stdin: %v", scanner.Err()) } } target.SetBytes([]byte(v)) default: return fmt.Errorf("expected bool but got %q (%T)", token.Value, token.Value) } return nil }