got terminal dimensions

This commit is contained in:
jms 2020-10-30 20:12:51 -05:00
parent 0f465b827f
commit 51892e26fe
10 changed files with 225 additions and 93 deletions

View File

@ -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())
}
}

View File

@ -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
}

View File

@ -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)
}

1
go.mod
View File

@ -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

19
ini/init.go Normal file
View File

@ -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)
}
}
}

View File

@ -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)

View File

@ -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 {

View File

@ -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")
}
}

71
templates/templates.go Normal file
View File

@ -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
}

4
templates/test.json Normal file
View File

@ -0,0 +1,4 @@
{
"sql": "SELECT usename, count(usename) FROM pg_stat_activity group by usename",
"columns": 2
}