Skip to content

Commit 7217c55

Browse files
committed
feat: refactoring
1 parent ce17326 commit 7217c55

File tree

5 files changed

+60
-31
lines changed

5 files changed

+60
-31
lines changed

cmd/sessionizer.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cmd
33
import (
44
"context"
55
"errors"
6+
"fmt"
67
"os"
78
"os/signal"
89

@@ -40,8 +41,15 @@ func newCmd() *cli.Command {
4041

4142
func run(ctx context.Context, cmd *cli.Command) error {
4243
pathResolver := handler.NewPathResolver()
43-
configParser := handler.NewConfigParser(pathResolver)
44-
sh := handler.NewSessionHandler(configParser, pathResolver)
44+
config, err := handler.NewConfigParser(pathResolver).ReadConfig()
45+
if err != nil {
46+
return fmt.Errorf("failed to run tmux-sessionizer because failed to read configration files: %w", err)
47+
}
48+
projectNameFullPathMap, projectExpressionNameMap, err := pathResolver.BuildProjectInfo(config)
49+
if err != nil {
50+
return fmt.Errorf("failed to build project information from .tmux-sessionizer config files: %w", err)
51+
}
52+
sh := handler.NewSessionHandler(config, pathResolver, projectNameFullPathMap, projectExpressionNameMap)
4553
return runWithHandler(sh, ctx, cmd)
4654
}
4755

handler/config_parser.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package handler
22

33
import (
44
"bufio"
5+
"errors"
56
"fmt"
67
"os"
78
"path/filepath"
@@ -33,15 +34,17 @@ func NewConfigParser(pr *PathResolver) *ConfigParser {
3334
}
3435
}
3536

36-
func (c *ConfigParser) ReadConfig() *Config {
37+
func (c *ConfigParser) ReadConfig() (*Config, error) {
3738
var configFiles = []string{"./.tmux-sessionizer", "~/.tmux-sessionizer"}
3839
for _, cf := range configFiles {
3940
config, err := c.ParseConfig(cf)
4041
if err == nil {
41-
return config
42+
return config, nil
43+
} else {
44+
return nil, err
4245
}
4346
}
44-
return nil
47+
return nil, errors.New("failed to read both config files, ${pwd}/.tmux-sessionizer, ${HOME}/.tmux-sessionizer")
4548
}
4649

4750
func (c *ConfigParser) ParseConfig(configFile string) (*Config, error) {

handler/handler.go

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,56 +15,48 @@ import (
1515
"github.com/manifoldco/promptui"
1616
)
1717

18-
type ISessionHandler interface {
19-
NewSession(ctx context.Context) error
20-
GrabExistingSession(ctx context.Context) error
21-
CreateNewProjectSession(ctx context.Context) error
22-
DeleteProjectSession(ctx context.Context) error
23-
}
24-
2518
type SessionHandler struct {
26-
c IConfigParser
27-
p IPathResolver
19+
config *Config
20+
pathResolver *PathResolver
21+
projectNameFullPathMap map[string]string
22+
projectExpressionNameMap map[string]string
2823
}
2924

30-
func NewSessionHandler(configParser IConfigParser, pathResolver IPathResolver) ISessionHandler {
25+
func NewSessionHandler(config *Config, pathResolver *PathResolver,
26+
projectNameFullPathMap, projectExpressionNameMap map[string]string) ISessionHandler {
3127
return &SessionHandler{
32-
c: configParser,
33-
p: pathResolver,
28+
config: config,
29+
pathResolver: pathResolver,
30+
projectNameFullPathMap: projectNameFullPathMap,
31+
projectExpressionNameMap: projectExpressionNameMap,
3432
}
3533
}
3634

3735
func (sh *SessionHandler) NewSession(ctx context.Context) error {
38-
config := sh.c.ReadConfig()
39-
if config == nil {
40-
return errors.New("failed to create new project from projects")
41-
}
4236
/*build fzf input and build hashmap to retrieve filepath from entry's name.*/
4337
var input bytes.Buffer
44-
projectNameFullPathMap, projectExpressionNameMap := make(map[string]string, 0), make(map[string]string, 0)
45-
for _, project := range config.Projects {
46-
replaced, err := sh.p.ReplaceHomeDir(project.filepath)
38+
for _, project := range sh.config.Projects {
39+
replaced, err := sh.pathResolver.ReplaceHomeDir(project.filepath)
4740
if err != nil {
4841
return errors.New("failed to replace home directory to ~")
4942
}
5043
input.WriteString(replaced + "\n")
51-
projectNameFullPathMap[project.name] = project.filepath
52-
projectExpressionNameMap[replaced] = project.name
5344
}
5445
fzfOut, err := sh.toFzf(input)
5546
if err != nil {
5647
return fmt.Errorf("failed to create new project from projects: %w", err)
5748
}
58-
sessionName := projectExpressionNameMap[strings.Trim(fzfOut.String(), "\n")]
49+
50+
sessionName := sh.projectExpressionNameMap[strings.Trim(fzfOut.String(), "\n")]
5951
if sh.isInSession() {
60-
return sh.switchToNewClient(sessionName, projectNameFullPathMap[sessionName])
52+
return sh.switchToNewClient(sessionName, sh.projectNameFullPathMap[sessionName])
6153
}
6254
if sh.sessionExists(sessionName) {
6355
return sh.attach(sessionName)
6456
}
6557
if err := sh.newTmuxCmd(
6658
"tmux", "new-session", "-s",
67-
sessionName, "-c", projectNameFullPathMap[sessionName]).Run(); err != nil {
59+
sessionName, "-c", sh.projectNameFullPathMap[sessionName]).Run(); err != nil {
6860
return fmt.Errorf("failed to create new session %w: ", err)
6961
}
7062
return nil
@@ -106,7 +98,7 @@ func (sh *SessionHandler) CreateNewProjectSession(ctx context.Context) error {
10698
if err != nil {
10799
return fmt.Errorf("faield to get new project information interactively: %w", err)
108100
}
109-
newProjectPath, err := sh.p.ExpandPath(filepath.Join(parentDir, fmt.Sprintf("%v/", newProjectName)))
101+
newProjectPath, err := sh.pathResolver.ExpandPath(filepath.Join(parentDir, fmt.Sprintf("%v/", newProjectName)))
110102
if err != nil {
111103
return fmt.Errorf("failed to expand path: %w", err)
112104
}
@@ -212,7 +204,7 @@ func (sh *SessionHandler) buildParentDirSet() (map[string]struct{}, error) {
212204
var configFiles = []string{"./.tmux-sessionizer", "~/.tmux-sessionizer"}
213205
parentDirSet := make(map[string]struct{}, 0)
214206
for _, configFile := range configFiles {
215-
path, err := sh.p.ExpandPath(configFile)
207+
path, err := sh.pathResolver.ExpandPath(configFile)
216208
if err != nil {
217209
return nil, fmt.Errorf("failed to expand path: %w", err)
218210
}

handler/interface.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package handler
22

3+
import "context"
4+
35
type IConfigParser interface {
46
ReadConfig() *Config
57
ParseConfig(configFile string) (*Config, error)
@@ -9,3 +11,10 @@ type IPathResolver interface {
911
ExpandPath(path string) (string, error)
1012
ReplaceHomeDir(fullpath string) (string, error)
1113
}
14+
15+
type ISessionHandler interface {
16+
NewSession(ctx context.Context) error
17+
GrabExistingSession(ctx context.Context) error
18+
CreateNewProjectSession(ctx context.Context) error
19+
DeleteProjectSession(ctx context.Context) error
20+
}

handler/path_resolver.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package handler
22

33
import (
4+
"bytes"
5+
"errors"
46
"os"
57
"path/filepath"
68
"strings"
@@ -30,3 +32,18 @@ func (p *PathResolver) ReplaceHomeDir(fullpath string) (string, error) {
3032
}
3133
return strings.Replace(fullpath, home, "~", 1), nil
3234
}
35+
36+
func (p *PathResolver) BuildProjectInfo(config *Config) (map[string]string, map[string]string, error) {
37+
var input bytes.Buffer
38+
projectNameFullPathMap, projectExpressionNameMap := make(map[string]string, 0), make(map[string]string, 0)
39+
for _, project := range config.Projects {
40+
replaced, err := p.ReplaceHomeDir(project.filepath)
41+
if err != nil {
42+
return nil, nil, errors.New("failed to replace home directory to ~")
43+
}
44+
input.WriteString(replaced + "\n")
45+
projectNameFullPathMap[project.name] = project.filepath
46+
projectExpressionNameMap[replaced] = project.name
47+
}
48+
return projectNameFullPathMap, projectExpressionNameMap, nil
49+
}

0 commit comments

Comments
 (0)