diff --git a/json/json.go b/json/json.go new file mode 100644 index 0000000..fa2f1bb --- /dev/null +++ b/json/json.go @@ -0,0 +1,29 @@ +package json + +import ( + "encoding/json" + "fmt" + + "github.com/joshmedeski/sesh/model" +) + +type Json interface { + EncodeSessions(sessions []model.SeshSession) string +} + +type RealJson struct{} + +func NewJson() Json { + return &RealJson{} +} + +func (j *RealJson) EncodeSessions(sessions []model.SeshSession) string { + jsonSessions, err := json.Marshal(sessions) + if err != nil { + fmt.Printf( + "Couldn't list sessions as json: %s\n", + err, + ) + } + return string(jsonSessions) +} diff --git a/json/mock_Json.go b/json/mock_Json.go new file mode 100644 index 0000000..235207d --- /dev/null +++ b/json/mock_Json.go @@ -0,0 +1,81 @@ +// Code generated by mockery v2.45.0. DO NOT EDIT. + +package json + +import ( + model "github.com/joshmedeski/sesh/model" + mock "github.com/stretchr/testify/mock" +) + +// MockJson is an autogenerated mock type for the Json type +type MockJson struct { + mock.Mock +} + +type MockJson_Expecter struct { + mock *mock.Mock +} + +func (_m *MockJson) EXPECT() *MockJson_Expecter { + return &MockJson_Expecter{mock: &_m.Mock} +} + +// EncodeSessions provides a mock function with given fields: sessions +func (_m *MockJson) EncodeSessions(sessions []model.SeshSession) string { + ret := _m.Called(sessions) + + if len(ret) == 0 { + panic("no return value specified for EncodeSessions") + } + + var r0 string + if rf, ok := ret.Get(0).(func([]model.SeshSession) string); ok { + r0 = rf(sessions) + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// MockJson_EncodeSessions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EncodeSessions' +type MockJson_EncodeSessions_Call struct { + *mock.Call +} + +// EncodeSessions is a helper method to define mock.On call +// - sessions []model.SeshSession +func (_e *MockJson_Expecter) EncodeSessions(sessions interface{}) *MockJson_EncodeSessions_Call { + return &MockJson_EncodeSessions_Call{Call: _e.mock.On("EncodeSessions", sessions)} +} + +func (_c *MockJson_EncodeSessions_Call) Run(run func(sessions []model.SeshSession)) *MockJson_EncodeSessions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]model.SeshSession)) + }) + return _c +} + +func (_c *MockJson_EncodeSessions_Call) Return(_a0 string) *MockJson_EncodeSessions_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *MockJson_EncodeSessions_Call) RunAndReturn(run func([]model.SeshSession) string) *MockJson_EncodeSessions_Call { + _c.Call.Return(run) + return _c +} + +// NewMockJson creates a new instance of MockJson. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockJson(t interface { + mock.TestingT + Cleanup(func()) +}) *MockJson { + mock := &MockJson{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/seshcli/list.go b/seshcli/list.go index fe1f668..42583e2 100644 --- a/seshcli/list.go +++ b/seshcli/list.go @@ -4,11 +4,13 @@ import ( "fmt" "github.com/joshmedeski/sesh/icon" + "github.com/joshmedeski/sesh/json" "github.com/joshmedeski/sesh/lister" + "github.com/joshmedeski/sesh/model" cli "github.com/urfave/cli/v2" ) -func List(icon icon.Icon, list lister.Lister) *cli.Command { +func List(icon icon.Icon, json json.Json, list lister.Lister) *cli.Command { return &cli.Command{ Name: "list", Aliases: []string{"l"}, @@ -59,6 +61,15 @@ func List(icon icon.Icon, list lister.Lister) *cli.Command { return fmt.Errorf("couldn't list sessions: %q", err) } + if cCtx.Bool("json") { + var sessionsArray []model.SeshSession + for _, i := range sessions.OrderedIndex { + sessionsArray = append(sessionsArray, sessions.Directory[i]) + } + fmt.Println(json.EncodeSessions(sessionsArray)) + return nil + } + for _, i := range sessions.OrderedIndex { name := sessions.Directory[i].Name if cCtx.Bool("icons") { diff --git a/seshcli/seshcli.go b/seshcli/seshcli.go index f0127d6..bc2791b 100644 --- a/seshcli/seshcli.go +++ b/seshcli/seshcli.go @@ -8,6 +8,7 @@ import ( "github.com/joshmedeski/sesh/git" "github.com/joshmedeski/sesh/home" "github.com/joshmedeski/sesh/icon" + "github.com/joshmedeski/sesh/json" "github.com/joshmedeski/sesh/lister" "github.com/joshmedeski/sesh/namer" "github.com/joshmedeski/sesh/oswrap" @@ -31,6 +32,7 @@ func App(version string) cli.App { dir := dir.NewDir(os, path) shell := shell.NewShell(exec) home := home.NewHome(os) + json := json.NewJson() // resource dependencies git := git.NewGit(shell) @@ -56,7 +58,7 @@ func App(version string) cli.App { Version: version, Usage: "Smart session manager for the terminal", Commands: []*cli.Command{ - List(icon, lister), + List(icon, json, lister), Connect(connector, icon), Clone(), },