dynamo-browse/cmd/dynamo-browse/main.go

171 lines
4.4 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"log"
"os"
"time"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/lmika/awstools/internal/common/ui/commandctrl"
"github.com/lmika/awstools/internal/common/ui/dispatcher"
"github.com/lmika/awstools/internal/common/ui/uimodels"
"github.com/lmika/awstools/internal/dynamo-browse/controllers"
"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/ui"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/modal"
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/tableselect"
"github.com/lmika/gopkgs/cli"
)
func main() {
var flagTable = flag.String("t", "", "dynamodb table name")
var flagLocal = flag.Bool("local", false, "local endpoint")
flag.Parse()
ctx := context.Background()
// TEMP
cfg, err := config.LoadDefaultConfig(ctx,
config.WithRegion("ap-southeast-2"),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("abc", "123", "")))
// END TEMP
if err != nil {
cli.Fatalf("cannot load AWS config: %v", err)
}
var dynamoClient *dynamodb.Client
if *flagLocal {
dynamoClient = dynamodb.NewFromConfig(cfg,
dynamodb.WithEndpointResolver(dynamodb.EndpointResolverFromURL("http://localhost:8000")))
} else {
dynamoClient = dynamodb.NewFromConfig(cfg)
}
dynamoProvider := dynamo.NewProvider(dynamoClient)
tableService := tables.NewService(dynamoProvider)
loopback := &msgLoopback{}
uiDispatcher := dispatcher.NewDispatcher(loopback)
tableReadController := controllers.NewTableReadController(tableService, *flagTable)
tableWriteController := controllers.NewTableWriteController(tableService, tableReadController, *flagTable)
commandController := commandctrl.NewCommandController(map[string]uimodels.Operation{
// "scan": tableReadController.Scan(),
"rw": tableWriteController.ToggleReadWrite(),
"dup": tableWriteController.Duplicate(),
})
_ = uiDispatcher
_ = commandController
// uiModel := ui.NewModel(uiDispatcher, commandController, tableReadController, tableWriteController)
// TEMP
// _ = uiModel
// END TEMP
/*
var model tea.Model = statusandprompt.New(
layout.NewVBox(
layout.LastChildFixedAt(11),
dynamotableview.New(tableReadController),
dynamoitemview.New(),
),
"Hello world",
)
model = layout.FullScreen(tableselect.New(model))
*/
model := ui.NewModel(tableReadController)
// Pre-determine if layout has dark background. This prevents calls for creating a list to hang.
lipgloss.HasDarkBackground()
//frameSet := frameset.New([]frameset.Frame{
// {
// Header: "Frame 1",
// Model: newTestModel("this is model 1"),
// },
// {
// Header: "Frame 2",
// Model: newTestModel("this is model 2"),
// },
//})
//
//modal := modal.New(frameSet)
p := tea.NewProgram(model, tea.WithAltScreen())
//loopback.program = p
// TEMP -- profiling
//cf, err := os.Create("trace.out")
//if err != nil {
// log.Fatal("could not create CPU profile: ", err)
//}
//defer cf.Close() // error handling omitted for example
//if err := trace.Start(cf); err != nil {
// log.Fatal("could not start CPU profile: ", err)
//}
//defer trace.Stop()
// END TEMP
f, err := tea.LogToFile("debug.log", "debug")
if err != nil {
fmt.Println("fatal:", err)
os.Exit(1)
}
defer f.Close()
log.Println("launching")
if err := p.Start(); err != nil {
fmt.Printf("Alas, there's been an error: %v", err)
os.Exit(1)
}
}
type msgLoopback struct {
program *tea.Program
}
func (m *msgLoopback) Send(msg tea.Msg) {
m.program.Send(msg)
}
func newTestModel(descr string) tea.Model {
return teamodels.TestModel{
Message: descr,
OnKeyPressed: func(k string) tea.Cmd {
log.Println("got key press: " + k)
if k == "enter" {
return tea.Batch(
tableselect.IndicateLoadingTables(),
tea.Sequentially(
func() tea.Msg {
<-time.After(2 * time.Second)
return nil
},
tableselect.ShowTableSelect(func(n string) tea.Cmd {
// return statusandprompt.SetStatus("New table = " + n)
return nil
}),
),
)
} else if k == "k" {
return modal.PopMode
}
return nil
},
}
}