A few various changes
- Fixed the '-local' flag to accept host and port - Added a '-debug' flag to accept a file to write debug log messages - Added some logic which will force the dark background flag on if MacOS is in dark mode
This commit is contained in:
parent
47e404aff7
commit
41af399215
|
@ -10,18 +10,21 @@ import (
|
||||||
"github.com/charmbracelet/lipgloss"
|
"github.com/charmbracelet/lipgloss"
|
||||||
"github.com/lmika/awstools/internal/common/ui/commandctrl"
|
"github.com/lmika/awstools/internal/common/ui/commandctrl"
|
||||||
"github.com/lmika/awstools/internal/common/ui/logging"
|
"github.com/lmika/awstools/internal/common/ui/logging"
|
||||||
|
"github.com/lmika/awstools/internal/common/ui/osstyle"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/controllers"
|
"github.com/lmika/awstools/internal/dynamo-browse/controllers"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/providers/dynamo"
|
"github.com/lmika/awstools/internal/dynamo-browse/providers/dynamo"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/services/tables"
|
"github.com/lmika/awstools/internal/dynamo-browse/services/tables"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/ui"
|
"github.com/lmika/awstools/internal/dynamo-browse/ui"
|
||||||
"github.com/lmika/gopkgs/cli"
|
"github.com/lmika/gopkgs/cli"
|
||||||
"log"
|
"log"
|
||||||
|
"net"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var flagTable = flag.String("t", "", "dynamodb table name")
|
var flagTable = flag.String("t", "", "dynamodb table name")
|
||||||
var flagLocal = flag.Bool("local", false, "local endpoint")
|
var flagLocal = flag.String("local", "", "local endpoint")
|
||||||
|
var flagDebug = flag.String("debug", "", "file to log debug messages")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
@ -32,9 +35,19 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var dynamoClient *dynamodb.Client
|
var dynamoClient *dynamodb.Client
|
||||||
if *flagLocal {
|
if *flagLocal != "" {
|
||||||
|
host, port, err := net.SplitHostPort(*flagLocal)
|
||||||
|
if err != nil {
|
||||||
|
cli.Fatalf("invalid address '%v': %v", *flagLocal, err)
|
||||||
|
}
|
||||||
|
if host == "" {
|
||||||
|
host = "localhost"
|
||||||
|
}
|
||||||
|
if port == "" {
|
||||||
|
port = "8000"
|
||||||
|
}
|
||||||
dynamoClient = dynamodb.NewFromConfig(cfg,
|
dynamoClient = dynamodb.NewFromConfig(cfg,
|
||||||
dynamodb.WithEndpointResolver(dynamodb.EndpointResolverFromURL("http://localhost:18000")))
|
dynamodb.WithEndpointResolver(dynamodb.EndpointResolverFromURL(fmt.Sprintf("http://%v:%v", host, port))))
|
||||||
} else {
|
} else {
|
||||||
dynamoClient = dynamodb.NewFromConfig(cfg)
|
dynamoClient = dynamodb.NewFromConfig(cfg)
|
||||||
}
|
}
|
||||||
|
@ -50,14 +63,28 @@ func main() {
|
||||||
commandController := commandctrl.NewCommandController()
|
commandController := commandctrl.NewCommandController()
|
||||||
model := ui.NewModel(tableReadController, tableWriteController, commandController)
|
model := ui.NewModel(tableReadController, tableWriteController, commandController)
|
||||||
|
|
||||||
// Pre-determine if layout has dark background. This prevents calls for creating a list to hang.
|
|
||||||
lipgloss.HasDarkBackground()
|
|
||||||
|
|
||||||
p := tea.NewProgram(model, tea.WithAltScreen())
|
p := tea.NewProgram(model, tea.WithAltScreen())
|
||||||
|
|
||||||
closeFn := logging.EnableLogging()
|
closeFn := logging.EnableLogging(*flagDebug)
|
||||||
defer closeFn()
|
defer closeFn()
|
||||||
|
|
||||||
|
// Pre-determine if layout has dark background. This prevents calls for creating a list to hang.
|
||||||
|
if lipgloss.HasDarkBackground() {
|
||||||
|
if colorScheme := osstyle.CurrentColorScheme(); colorScheme == osstyle.ColorSchemeLightMode {
|
||||||
|
log.Printf("terminal reads dark but really in light mode")
|
||||||
|
lipgloss.SetHasDarkBackground(true)
|
||||||
|
} else {
|
||||||
|
log.Printf("in dark background")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if colorScheme := osstyle.CurrentColorScheme(); colorScheme == osstyle.ColorSchemeDarkMode {
|
||||||
|
log.Printf("terminal reads light but really in dark mode")
|
||||||
|
lipgloss.SetHasDarkBackground(true)
|
||||||
|
} else {
|
||||||
|
log.Printf("cannot detect system darkmode")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.Println("launching")
|
log.Println("launching")
|
||||||
if err := p.Start(); err != nil {
|
if err := p.Start(); err != nil {
|
||||||
fmt.Printf("Alas, there's been an error: %v", err)
|
fmt.Printf("Alas, there's been an error: %v", err)
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -41,7 +41,7 @@ require (
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||||
github.com/juju/ansiterm v0.0.0-20210929141451-8b71cc96ebdc // indirect
|
github.com/juju/ansiterm v0.0.0-20210929141451-8b71cc96ebdc // indirect
|
||||||
github.com/lmika/go-bubble-table v0.2.2-0.20220608033210-61eeb29a6239 // indirect
|
github.com/lmika/go-bubble-table v0.2.2-0.20220616114432-6bbb2995e538 // indirect
|
||||||
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
|
||||||
github.com/lunixbochs/vtclean v1.0.0 // indirect
|
github.com/lunixbochs/vtclean v1.0.0 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.14 // indirect
|
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -102,6 +102,8 @@ github.com/lmika/events v0.0.0-20200906102219-a2269cd4394e h1:0QkUe2ejnT/i+xbgGy
|
||||||
github.com/lmika/events v0.0.0-20200906102219-a2269cd4394e/go.mod h1:qtkBmNC9OfD0STtOR9sF55pQchjIfNlC3gzm4n8CrqM=
|
github.com/lmika/events v0.0.0-20200906102219-a2269cd4394e/go.mod h1:qtkBmNC9OfD0STtOR9sF55pQchjIfNlC3gzm4n8CrqM=
|
||||||
github.com/lmika/go-bubble-table v0.2.2-0.20220608033210-61eeb29a6239 h1:GGw5pZtEFnHtD7kKdWsiwgcIwZTnok60sShrHVYz4ok=
|
github.com/lmika/go-bubble-table v0.2.2-0.20220608033210-61eeb29a6239 h1:GGw5pZtEFnHtD7kKdWsiwgcIwZTnok60sShrHVYz4ok=
|
||||||
github.com/lmika/go-bubble-table v0.2.2-0.20220608033210-61eeb29a6239/go.mod h1:0RT1upgKZ6qZ6B1SqseE3wWsPjSQRv/G/HjpYK8jNsg=
|
github.com/lmika/go-bubble-table v0.2.2-0.20220608033210-61eeb29a6239/go.mod h1:0RT1upgKZ6qZ6B1SqseE3wWsPjSQRv/G/HjpYK8jNsg=
|
||||||
|
github.com/lmika/go-bubble-table v0.2.2-0.20220616114432-6bbb2995e538 h1:dtMPRNoDqDnnP3HgOvYhswcJVSqdISkYlCtGOjTqg6Q=
|
||||||
|
github.com/lmika/go-bubble-table v0.2.2-0.20220616114432-6bbb2995e538/go.mod h1:0RT1upgKZ6qZ6B1SqseE3wWsPjSQRv/G/HjpYK8jNsg=
|
||||||
github.com/lmika/gopkgs v0.0.0-20211210041137-0dc91e939890 h1:mwl/exYV/WkBMeShqK7q+B2w2r+b0vP1TSA7clBn9kI=
|
github.com/lmika/gopkgs v0.0.0-20211210041137-0dc91e939890 h1:mwl/exYV/WkBMeShqK7q+B2w2r+b0vP1TSA7clBn9kI=
|
||||||
github.com/lmika/gopkgs v0.0.0-20211210041137-0dc91e939890/go.mod h1:FH6OJSvYcJ9xY8CGs9yGgR89kMCK1UimuUQ6kE5YuJQ=
|
github.com/lmika/gopkgs v0.0.0-20211210041137-0dc91e939890/go.mod h1:FH6OJSvYcJ9xY8CGs9yGgR89kMCK1UimuUQ6kE5YuJQ=
|
||||||
github.com/lmika/shellwords v0.0.0-20140714114018-ce258dd729fe h1:1UXS/6OFkbi6JrihPykmYO1VtsABB02QQ+YmYYzTY18=
|
github.com/lmika/shellwords v0.0.0-20140714114018-ce258dd729fe h1:1UXS/6OFkbi6JrihPykmYO1VtsABB02QQ+YmYYzTY18=
|
||||||
|
|
|
@ -31,6 +31,15 @@ func PromptForInput(prompt string, onDone func(value string) tea.Cmd) tea.Cmd {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Confirm(prompt string, onYes func() tea.Cmd) tea.Cmd {
|
||||||
|
return PromptForInput(prompt, func(value string) tea.Cmd {
|
||||||
|
if value == "y" {
|
||||||
|
return onYes()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
type MessageWithStatus interface {
|
type MessageWithStatus interface {
|
||||||
StatusMessage() string
|
StatusMessage() string
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,15 +6,18 @@ import (
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func EnableLogging() (closeFn func()) {
|
func EnableLogging(logFile string) (closeFn func()) {
|
||||||
tempFile, err := os.CreateTemp("", "debug.log")
|
if logFile == "" {
|
||||||
if err != nil {
|
tempFile, err := os.CreateTemp("", "debug.log")
|
||||||
fmt.Println("fatal:", err)
|
if err != nil {
|
||||||
os.Exit(1)
|
fmt.Println("fatal:", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
tempFile.Close()
|
||||||
|
logFile = tempFile.Name()
|
||||||
}
|
}
|
||||||
tempFile.Close()
|
|
||||||
|
|
||||||
f, err := tea.LogToFile(tempFile.Name(), "debug")
|
f, err := tea.LogToFile(logFile, "debug")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("fatal:", err)
|
fmt.Println("fatal:", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
18
internal/common/ui/osstyle/osstyle.go
Normal file
18
internal/common/ui/osstyle/osstyle.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package osstyle
|
||||||
|
|
||||||
|
type ColorScheme int
|
||||||
|
|
||||||
|
const (
|
||||||
|
ColorSchemeUnknown ColorScheme = iota
|
||||||
|
ColorSchemeLightMode
|
||||||
|
ColorSchemeDarkMode
|
||||||
|
)
|
||||||
|
|
||||||
|
var getOSColorScheme func() ColorScheme = nil
|
||||||
|
|
||||||
|
func CurrentColorScheme() ColorScheme {
|
||||||
|
if getOSColorScheme == nil {
|
||||||
|
return ColorSchemeUnknown
|
||||||
|
}
|
||||||
|
return getOSColorScheme()
|
||||||
|
}
|
27
internal/common/ui/osstyle/osstyle_darwin.go
Normal file
27
internal/common/ui/osstyle/osstyle_darwin.go
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
package osstyle
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os/exec"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Usage: https://stefan.sofa-rockers.org/2018/10/23/macos-dark-mode-terminal-vim/
|
||||||
|
func darwinGetOSColorScheme() ColorScheme {
|
||||||
|
d, err := exec.Command("defaults", "read", "-g", "AppleInterfaceStyle").Output()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("cannot get current OS color scheme: %v", err)
|
||||||
|
return ColorSchemeUnknown
|
||||||
|
}
|
||||||
|
|
||||||
|
switch string(d) {
|
||||||
|
case "Dark\n":
|
||||||
|
return ColorSchemeDarkMode
|
||||||
|
case "Light\n":
|
||||||
|
return ColorSchemeLightMode
|
||||||
|
}
|
||||||
|
return ColorSchemeUnknown
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
getOSColorScheme = darwinGetOSColorScheme
|
||||||
|
}
|
|
@ -1,18 +1,18 @@
|
||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
tea "github.com/charmbracelet/bubbletea"
|
tea "github.com/charmbracelet/bubbletea"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/models"
|
"github.com/lmika/awstools/internal/dynamo-browse/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NewResultSet struct {
|
type NewResultSet struct {
|
||||||
ResultSet *models.ResultSet
|
ResultSet *models.ResultSet
|
||||||
|
statusMessage string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rs NewResultSet) StatusMessage() string {
|
func (rs NewResultSet) StatusMessage() string {
|
||||||
return fmt.Sprintf("%d items returned", len(rs.ResultSet.Items()))
|
//return fmt.Sprintf("%d items returned", len(rs.ResultSet.Items()))
|
||||||
|
return rs.statusMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
type SetReadWrite struct {
|
type SetReadWrite struct {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package controllers
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/csv"
|
"encoding/csv"
|
||||||
|
"fmt"
|
||||||
tea "github.com/charmbracelet/bubbletea"
|
tea "github.com/charmbracelet/bubbletea"
|
||||||
"github.com/lmika/awstools/internal/common/ui/events"
|
"github.com/lmika/awstools/internal/common/ui/events"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/models"
|
"github.com/lmika/awstools/internal/dynamo-browse/models"
|
||||||
|
@ -126,16 +127,23 @@ func (c *TableReadController) doScan(ctx context.Context, resultSet *models.Resu
|
||||||
return c.setResultSetAndFilter(newResultSet, c.state.Filter())
|
return c.setResultSetAndFilter(newResultSet, c.state.Filter())
|
||||||
}
|
}
|
||||||
|
|
||||||
//func (c *TableReadController) ResultSet() *models.ResultSet {
|
|
||||||
// c.mutex.Lock()
|
|
||||||
// defer c.mutex.Unlock()
|
|
||||||
//
|
|
||||||
// return c.resultSet
|
|
||||||
//}
|
|
||||||
|
|
||||||
func (c *TableReadController) setResultSetAndFilter(resultSet *models.ResultSet, filter string) tea.Msg {
|
func (c *TableReadController) setResultSetAndFilter(resultSet *models.ResultSet, filter string) tea.Msg {
|
||||||
c.state.setResultSetAndFilter(resultSet, filter)
|
c.state.setResultSetAndFilter(resultSet, filter)
|
||||||
return NewResultSet{resultSet}
|
|
||||||
|
var statusMessage string
|
||||||
|
if filter != "" {
|
||||||
|
var filteredCount int
|
||||||
|
for i := range resultSet.Items() {
|
||||||
|
if !resultSet.Hidden(i) {
|
||||||
|
filteredCount += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
statusMessage = fmt.Sprintf("%d of %d items returned", filteredCount, len(resultSet.Items()))
|
||||||
|
} else {
|
||||||
|
statusMessage = fmt.Sprintf("%d items returned", len(resultSet.Items()))
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewResultSet{resultSet, statusMessage}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *TableReadController) Unmark() tea.Cmd {
|
func (c *TableReadController) Unmark() tea.Cmd {
|
||||||
|
|
|
@ -61,7 +61,7 @@ func (twc *TableWriteController) NewItem() tea.Cmd {
|
||||||
Dirty: true,
|
Dirty: true,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
return NewResultSet{twc.state.ResultSet()}
|
return NewResultSet{twc.state.ResultSet(), "New item added"}
|
||||||
}
|
}
|
||||||
|
|
||||||
return keyPrompts.next()
|
return keyPrompts.next()
|
||||||
|
|
|
@ -128,9 +128,7 @@ func (m *Model) setLeftmostDisplayedColumn(newCol int) {
|
||||||
} else {
|
} else {
|
||||||
m.colOffset = newCol
|
m.colOffset = newCol
|
||||||
}
|
}
|
||||||
// TEMP
|
m.table.UpdateView()
|
||||||
m.table.GoDown()
|
|
||||||
m.table.GoUp()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Model) View() string {
|
func (m *Model) View() string {
|
||||||
|
@ -172,15 +170,6 @@ func (m *Model) rebuildTable() {
|
||||||
|
|
||||||
m.rows = newRows
|
m.rows = newRows
|
||||||
newTbl.SetRows(newRows)
|
newTbl.SetRows(newRows)
|
||||||
/*
|
|
||||||
for newTbl.Cursor() != m.table.Cursor() {
|
|
||||||
if newTbl.Cursor() < m.table.Cursor() {
|
|
||||||
newTbl.GoDown()
|
|
||||||
} else if newTbl.Cursor() > m.table.Cursor() {
|
|
||||||
newTbl.GoUp()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
m.table = newTbl
|
m.table = newTbl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
markedRowStyle = lipgloss.NewStyle().
|
markedRowStyle = lipgloss.NewStyle().
|
||||||
Background(lipgloss.AdaptiveColor{Dark: "#e1e1e1", Light: "#414141"})
|
Background(lipgloss.AdaptiveColor{Light: "#e1e1e1", Dark: "#414141"})
|
||||||
dirtyRowStyle = lipgloss.NewStyle().
|
dirtyRowStyle = lipgloss.NewStyle().
|
||||||
Foreground(lipgloss.Color("#e13131"))
|
Foreground(lipgloss.Color("#e13131"))
|
||||||
newRowStyle = lipgloss.NewStyle().
|
newRowStyle = lipgloss.NewStyle().
|
||||||
|
@ -60,6 +60,8 @@ func (mtr itemTableRow) Render(w io.Writer, model table.Model, index int) {
|
||||||
if mi := r.MetaInfo(); mi != "" {
|
if mi := r.MetaInfo(); mi != "" {
|
||||||
sb.WriteString(metaInfoStyle.Render(mi))
|
sb.WriteString(metaInfoStyle.Render(mi))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
sb.WriteString(metaInfoStyle.Render("~"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,3 +77,24 @@ func (c *SSMController) Clone(param models.SSMParameter) tea.Cmd {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *SSMController) DeleteParameter(param models.SSMParameter) tea.Cmd {
|
||||||
|
return events.Confirm("delete parameter? ", func() tea.Cmd {
|
||||||
|
return func() tea.Msg {
|
||||||
|
ctx := context.Background()
|
||||||
|
if err := c.service.Delete(ctx, param); err != nil {
|
||||||
|
return events.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := c.service.List(context.Background(), c.prefix)
|
||||||
|
if err != nil {
|
||||||
|
return events.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewParameterListMsg{
|
||||||
|
Prefix: c.prefix,
|
||||||
|
Parameters: res,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -56,9 +56,9 @@ outer:
|
||||||
|
|
||||||
func (p *Provider) Put(ctx context.Context, param models.SSMParameter, override bool) error {
|
func (p *Provider) Put(ctx context.Context, param models.SSMParameter, override bool) error {
|
||||||
in := &ssm.PutParameterInput{
|
in := &ssm.PutParameterInput{
|
||||||
Name: aws.String(param.Name),
|
Name: aws.String(param.Name),
|
||||||
Type: param.Type,
|
Type: param.Type,
|
||||||
Value: aws.String(param.Value),
|
Value: aws.String(param.Value),
|
||||||
Overwrite: override,
|
Overwrite: override,
|
||||||
}
|
}
|
||||||
if param.Type == types.ParameterTypeSecureString {
|
if param.Type == types.ParameterTypeSecureString {
|
||||||
|
@ -72,3 +72,13 @@ func (p *Provider) Put(ctx context.Context, param models.SSMParameter, override
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Provider) Delete(ctx context.Context, param models.SSMParameter) error {
|
||||||
|
_, err := p.client.DeleteParameter(ctx, &ssm.DeleteParameterInput{
|
||||||
|
Name: aws.String(param.Name),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "unable to delete SSM parameter")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -8,4 +8,5 @@ import (
|
||||||
type SSMProvider interface {
|
type SSMProvider interface {
|
||||||
List(ctx context.Context, prefix string, maxCount int) (*models.SSMParameters, error)
|
List(ctx context.Context, prefix string, maxCount int) (*models.SSMParameters, error)
|
||||||
Put(ctx context.Context, param models.SSMParameter, override bool) error
|
Put(ctx context.Context, param models.SSMParameter, override bool) error
|
||||||
|
Delete(ctx context.Context, param models.SSMParameter) error
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,9 +21,13 @@ func (s *Service) List(ctx context.Context, prefix string) (*models.SSMParameter
|
||||||
|
|
||||||
func (s *Service) Clone(ctx context.Context, param models.SSMParameter, newName string) error {
|
func (s *Service) Clone(ctx context.Context, param models.SSMParameter, newName string) error {
|
||||||
newParam := models.SSMParameter{
|
newParam := models.SSMParameter{
|
||||||
Name: newName,
|
Name: newName,
|
||||||
Type: param.Type,
|
Type: param.Type,
|
||||||
Value: param.Value,
|
Value: param.Value,
|
||||||
}
|
}
|
||||||
return s.provider.Put(ctx, newParam, false)
|
return s.provider.Put(ctx, newParam, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Service) Delete(ctx context.Context, param models.SSMParameter) error {
|
||||||
|
return s.provider.Delete(ctx, param)
|
||||||
|
}
|
||||||
|
|
|
@ -37,6 +37,12 @@ func NewModel(controller *controllers.SSMController, cmdController *commandctrl.
|
||||||
}
|
}
|
||||||
return events.SetError(errors.New("no parameter selected"))
|
return events.SetError(errors.New("no parameter selected"))
|
||||||
},
|
},
|
||||||
|
"delete": func(args []string) tea.Cmd {
|
||||||
|
if currentParam := ssmList.CurrentParameter(); currentParam != nil {
|
||||||
|
return controller.DeleteParameter(*currentParam)
|
||||||
|
}
|
||||||
|
return events.SetError(errors.New("no parameter selected"))
|
||||||
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -2,24 +2,23 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/brianvoe/gofakeit/v6"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
|
||||||
"log"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/config"
|
"github.com/aws/aws-sdk-go-v2/config"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
|
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
|
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
|
||||||
|
"github.com/brianvoe/gofakeit/v6"
|
||||||
|
"github.com/google/uuid"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/models"
|
"github.com/lmika/awstools/internal/dynamo-browse/models"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/providers/dynamo"
|
"github.com/lmika/awstools/internal/dynamo-browse/providers/dynamo"
|
||||||
"github.com/lmika/awstools/internal/dynamo-browse/services/tables"
|
"github.com/lmika/awstools/internal/dynamo-browse/services/tables"
|
||||||
"github.com/lmika/gopkgs/cli"
|
"github.com/lmika/gopkgs/cli"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
tableName := "awstools-test"
|
tableName := "business-addresses"
|
||||||
totalItems := 5000
|
totalItems := 5000
|
||||||
|
|
||||||
cfg, err := config.LoadDefaultConfig(ctx)
|
cfg, err := config.LoadDefaultConfig(ctx)
|
||||||
|
@ -67,21 +66,18 @@ func main() {
|
||||||
for i := 0; i < totalItems; i++ {
|
for i := 0; i < totalItems; i++ {
|
||||||
key := uuid.New().String()
|
key := uuid.New().String()
|
||||||
if err := tableService.Put(ctx, tableInfo, models.Item{
|
if err := tableService.Put(ctx, tableInfo, models.Item{
|
||||||
"pk": &types.AttributeValueMemberS{Value: key},
|
"pk": &types.AttributeValueMemberS{Value: key},
|
||||||
"sk": &types.AttributeValueMemberS{Value: key},
|
"sk": &types.AttributeValueMemberS{Value: key},
|
||||||
"name": &types.AttributeValueMemberS{Value: gofakeit.Name()},
|
"name": &types.AttributeValueMemberS{Value: gofakeit.Name()},
|
||||||
"address": &types.AttributeValueMemberS{Value: gofakeit.Address().Address},
|
"address": &types.AttributeValueMemberS{Value: gofakeit.Address().Address},
|
||||||
"city": &types.AttributeValueMemberS{Value: gofakeit.Address().City},
|
"city": &types.AttributeValueMemberS{Value: gofakeit.Address().City},
|
||||||
"phone": &types.AttributeValueMemberN{Value: gofakeit.Phone()},
|
"phone": &types.AttributeValueMemberN{Value: gofakeit.Phone()},
|
||||||
"web": &types.AttributeValueMemberS{Value: gofakeit.URL()},
|
"web": &types.AttributeValueMemberS{Value: gofakeit.URL()},
|
||||||
"inOffice": &types.AttributeValueMemberBOOL{Value: gofakeit.Bool()},
|
"officeOpened": &types.AttributeValueMemberBOOL{Value: gofakeit.Bool()},
|
||||||
"ratings": &types.AttributeValueMemberL{Value: []types.AttributeValue{
|
"ratings": &types.AttributeValueMemberL{Value: []types.AttributeValue{
|
||||||
&types.AttributeValueMemberS{Value: gofakeit.Adverb()},
|
&types.AttributeValueMemberN{Value: fmt.Sprint(gofakeit.IntRange(0, 5))},
|
||||||
&types.AttributeValueMemberN{Value: "12.34"},
|
&types.AttributeValueMemberN{Value: fmt.Sprint(gofakeit.IntRange(0, 5))},
|
||||||
}},
|
&types.AttributeValueMemberN{Value: fmt.Sprint(gofakeit.IntRange(0, 5))},
|
||||||
"values": &types.AttributeValueMemberM{Value: map[string]types.AttributeValue{
|
|
||||||
"adverb": &types.AttributeValueMemberS{Value: gofakeit.Adverb()},
|
|
||||||
"int": &types.AttributeValueMemberN{Value: strconv.Itoa(int(gofakeit.Int32()))},
|
|
||||||
}},
|
}},
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
|
|
Loading…
Reference in a new issue