From 51892e26fe29e3b1b324797e2687b3bf6b2db03c Mon Sep 17 00:00:00 2001 From: jms Date: Fri, 30 Oct 2020 20:12:51 -0500 Subject: [PATCH] got terminal dimensions --- cmd/root.go | 28 ++++------- config/config.go | 66 ------------------------- data/data.go | 10 ++-- go.mod | 1 + ini/init.go | 19 ++++++++ logger/logger.go | 7 +++ look/look.go | 106 ++++++++++++++++++++++++++++++++++++++++- main_test.go | 6 +-- templates/templates.go | 71 +++++++++++++++++++++++++++ templates/test.json | 4 ++ 10 files changed, 225 insertions(+), 93 deletions(-) delete mode 100644 config/config.go create mode 100644 ini/init.go create mode 100644 templates/templates.go create mode 100644 templates/test.json diff --git a/cmd/root.go b/cmd/root.go index 8f1476f..9d29616 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -18,11 +18,11 @@ package cmd import ( "fmt" "github.com/spf13/cobra" + "log" "os" "path" "path/filepath" - "pgm/config" - "pgm/logger" + "pgm/ini" homedir "github.com/mitchellh/go-homedir" "github.com/spf13/viper" @@ -58,7 +58,7 @@ func init() { var homeDirectory string homeDirectory, err := os.UserHomeDir() if err != nil { - logger.Logger("[ERROR] unable to init with home directory") + log.Fatal(err) } cobra.OnInitialize(InitConfig) @@ -73,9 +73,8 @@ func init() { rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") customPgm := viper.GetString("pgm_home_overide") if len(customPgm) > 0 { - logger.Logger("[LOG] custom pgm overide set at: " + customPgm) if filepath.IsAbs(customPgm) != true { - logger.Logger("[ERROR] failed to add non absolute path to viper") + log.Fatal(err) } else { viper.AddConfigPath(customPgm) pgmDir := viper.GetString("pgm_dir") @@ -90,17 +89,14 @@ func init() { viper.SetConfigName(".pgm") viper.SetDefault("homeDir", homeDirectory) err = viper.ReadInConfig() - if err != nil { - logger.Logger("[ERROR] viper hostCfgFile issue" + err.Error()) - } - pgmDir := viper.GetString("pgm_dir") + pgmDir := viper.GetString("pgm_home") logsDir := viper.GetString("logs_dir") hostsDir := viper.GetString("hosts_dir") cfgDir := viper.GetString("cfg_dir") - viper.SetDefault("pgmDir", homeDirectory + pgmDir) - viper.SetDefault("hostsDir", homeDirectory + pgmDir + "/" + hostsDir) - viper.SetDefault("cfgDir", homeDirectory + pgmDir + "/" + cfgDir) - viper.SetDefault("logsDir", homeDirectory + pgmDir + "/" + logsDir) + viper.SetDefault("pgmDir", homeDirectory + "/" + pgmDir) + viper.SetDefault("hostsDir", homeDirectory + "/" + pgmDir + "/" + hostsDir) + viper.SetDefault("cfgDir", homeDirectory + "/" + pgmDir + "/" + cfgDir) + viper.SetDefault("logsDir", homeDirectory + "/" + pgmDir + "/" + logsDir) @@ -133,12 +129,8 @@ func InitConfig() { pgm = viper.GetString("pgmDir") s := []string{hosts, cfg, logs, pgm} - config.IsInit(s) + ini.IsInit(s) viper.AutomaticEnv() // read in environment variables that match - // If a hostCfgFile file is found, read it in. - if err := viper.ReadInConfig(); err == nil { - logger.Logger("[LOG] Using hostCfgFile file:"+ viper.ConfigFileUsed()) - } } diff --git a/config/config.go b/config/config.go deleted file mode 100644 index 5f1c04a..0000000 --- a/config/config.go +++ /dev/null @@ -1,66 +0,0 @@ -package config - -import ( - "fmt" - "github.com/spf13/viper" - "log" - "os" - "pgm/logger" - "strings" -) - -// checks to make sure things look like we want locally. -func IsInit(s []string) { - var isCfg []bool - var dirs []string - - // if there is no $HOME/.pgm dir - if _, err := os.Stat(homeDirectory + "/.pgm"); os.IsNotExist(err) { - err = os.Mkdir(homeDirectory+"/.pgm/", 0755) - if err != nil { - log.Fatal(err) - } - } - // creates logs, src, and hosts directories. - for _, f := range dirs { - if len(f) > 0 { - err := os.MkdirAll(homeDirectory+"/"+f, 0755) - if err != nil { - log.Fatal(err) - } - isCfg = append(isCfg, true) - } - } - - for _, b := range isCfg { - if b == false { - return false - } - } - return true -} - - - -// repeated method to get config data -func ReadConfig() (*viper.Viper, error) { - var filename string - var h string - h, err := os.UserHomeDir() - if err != nil { - lgd := logger.Logger("failed to open config " + err.Error()) - if lgd == true { - fmt.Println("failed to read config, failure was logged") - } - - } - filename = h + "/" + ".pgm.yaml" - v := viper.New() - - v.AutomaticEnv() - if err := v.ReadInConfig(); err == nil { - v.SetConfigFile(filename) - return v, err - } - return v, nil -} diff --git a/data/data.go b/data/data.go index 3a96e75..21d1890 100644 --- a/data/data.go +++ b/data/data.go @@ -8,7 +8,7 @@ import ( "pgm/logger" ) -// Simple config file for connecting to databases. +// Simple ini file for connecting to databases. type HostDetails struct { Secret string `json:"secret"` Hostname string `json:"hostname"` @@ -41,7 +41,7 @@ func ReadHosts() []string { return pgee } -// handles interacting with the config file. +// handles interacting with the ini file. func ViperPgmConfig(k string, a string) (bool, string) { var h string var s string @@ -53,9 +53,9 @@ func ViperPgmConfig(k string, a string) (bool, string) { viper.SetConfigName(".pgm") viper.SetConfigType("yaml") viper.AddConfigPath(h) - err = viper.ReadInConfig() // Find and read the config file - if err != nil { // Handle errors reading the config file - logger.Logger("[ERROR] failed to load viper config: " + err.Error()) + err = viper.ReadInConfig() // Find and read the ini file + if err != nil { // Handle errors reading the ini file + logger.Logger("[ERROR] failed to load viper ini: " + err.Error()) fmt.Println("error occurred and was logged.") os.Exit(1) } diff --git a/go.mod b/go.mod index 7429ab6..fda1700 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/spf13/cobra v1.1.1 github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.7.1 + golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 golang.org/x/sys v0.0.0-20201024132449-ef9fd89ba245 // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect diff --git a/ini/init.go b/ini/init.go new file mode 100644 index 0000000..279938b --- /dev/null +++ b/ini/init.go @@ -0,0 +1,19 @@ +package ini + +import ( + "fmt" + "os" +) + +// checks to make sure things look like we want locally. +func IsInit(s []string) { + for _, i := range s { + err := os.MkdirAll(i, 0755) + if err != nil { + fmt.Println("error occurred writing config files, may not have correct permissions") + fmt.Println(err) + os.Exit(1) + } + } +} + diff --git a/logger/logger.go b/logger/logger.go index 958d622..641fb23 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -1,6 +1,7 @@ package logger import ( + "github.com/spf13/viper" "log" "os" ) @@ -21,6 +22,12 @@ func Logger(s string) bool { os.Remove("/var/tmp/PGMLOGTEST") return true } + var fp string + fp = viper.GetString("logsDir") + if _, err := os.Stat(fp + "/log"); os.IsNotExist(err) { + // path/to/whatever does not exist + os.Create( fp + "/log") + } file, err := os.OpenFile(h + "/.pgm/logs/log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) if err != nil { log.Fatal(err) diff --git a/look/look.go b/look/look.go index d77f87d..3258d87 100644 --- a/look/look.go +++ b/look/look.go @@ -1,23 +1,127 @@ package look import ( + //"database/sql" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/glamour" + "github.com/charmbracelet/bubbles/viewport" + "github.com/muesli/termenv" + tp "pgm/templates" "encoding/json" "fmt" "github.com/spf13/viper" "io/ioutil" + //"log" "pgm/data" + //db2 "pgm/db" "pgm/logger" + "time" + //"os" ) +var term = termenv.ColorProfile() + +var ( + columns = []string{"name", "company"} + rows = []string{"bob", "fart co"} + colCt = 2 + sql_test = "SELECT usename, count(usename) FROM pg_stat_activity where usename is not null group by usename" +) + +type tickMsg time.Time + + +func (e screen) Init() tea.Cmd { + return nil +} + + +type screen struct { + viewport viewport.Model +} + // the default view for a user once they load a database is called the look. // the look loads func Look(f string) { var connectionDetails data.HostDetails connectionDetails = loadHost(f) - fmt.Println(connectionDetails) + _ = connectionDetails + + + var t tp.Tbl + t = tp.Tbl{columns, colCt, rows, ""} + tp.Table(t) + + + + //model, err := newExample() + //if err != nil { + // fmt.Println("Could not intialize Bubble Tea model:", err) + // os.Exit(1) + //} + // + //if err := tea.NewProgram(model).Start(); err != nil { + // fmt.Println("Bummer, there's been an error:", err) + // os.Exit(1) + //} + } +func (e screen) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.WindowSizeMsg: + e.viewport.Width = msg.Width + return e, nil + + case tea.KeyMsg: + switch msg.String() { + case "q", "ctrl+c": + return e, tea.Quit + default: + vp, _ := viewport.Update(msg, e.viewport) + e.viewport = vp + } + } + + return e, nil +} + +func (e screen) View() string { + return viewport.View(e.viewport) + e.helpView() +} + +func (e screen) helpView() string { + return termenv.String("\n ↑/↓: Navigate • q: Quit\n").Foreground(term.Color("241")).String() +} + + + +func newExample() (*screen, error) { + vp := viewport.Model{Width: 78, Height: 10} + renderer, err := glamour.NewTermRenderer(glamour.WithStylePath("notty")) + if err != nil { + return nil, err + } + + var t tp.Tbl + t = tp.Tbl{columns, colCt, rows, ""} + tp.Table(t) + + + str, err := renderer.Render(t.View) + if err != nil { + return nil, err + } + + vp.SetContent(str) + + return &screen{ + viewport: vp, + }, nil +} + + // gets information for host from hostDir func loadHost(f string) data.HostDetails { diff --git a/main_test.go b/main_test.go index 3a07870..05d735f 100644 --- a/main_test.go +++ b/main_test.go @@ -3,7 +3,7 @@ package main_test import ( "encoding/json" "github.com/spf13/viper" - "pgm/config" + "pgm/ini" "pgm/data" "pgm/db" "pgm/logger" @@ -27,10 +27,10 @@ func TestLoadConfig(t *testing.T) { var v *viper.Viper var want error = nil - v, got := config.ReadConfig() + v, got := ini.ReadConfig() _ = v if want != got { - t.Error("load config reaturned a non nil error") + t.Error("load ini reaturned a non nil error") } } diff --git a/templates/templates.go b/templates/templates.go new file mode 100644 index 0000000..d9e782e --- /dev/null +++ b/templates/templates.go @@ -0,0 +1,71 @@ +package templates + +import ( + "fmt" + "golang.org/x/crypto/ssh/terminal" + "log" +) + + + +type Tbl struct { + Column []string + Colct int + Row []string + View string +} + + +// consumes columns +func Table(t Tbl){ + _ = t + w, h, err := terminal.GetSize(1) + if err != nil { + log.Fatal(err) + } + fmt.Println(w) + fmt.Println(h) + //populate(&t) + //return t +} + + + + +func populate(t *Tbl) *Tbl{ + var v string + for i, c := range t.Column { + var col string + var coll string + col = "| %s |" + coll = "| %s |\n" + var header string + if i == len(t.Column) -1 { + fmt.Println() + header = fmt.Sprintf(coll, c) + v = v + header + } else { + header = fmt.Sprintf(col, c) + v = v + header + } + + + } + for i, c := range t.Row { + if i == len(t.Row[0]) { + colnl := "\n| %s |" + var header string + header = fmt.Sprintf(colnl, c) + v = v + header + } else { + cl := "| %s |" + var h string + h = fmt.Sprintf(cl, c) + v = v + h + } + + } + t.View = v + return t + +} \ No newline at end of file diff --git a/templates/test.json b/templates/test.json new file mode 100644 index 0000000..cf25378 --- /dev/null +++ b/templates/test.json @@ -0,0 +1,4 @@ +{ + "sql": "SELECT usename, count(usename) FROM pg_stat_activity group by usename", + "columns": 2 +} \ No newline at end of file