-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
134 lines (113 loc) · 3.09 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package main
import (
"fmt"
"log"
"os"
"path"
"path/filepath"
"runtime/debug"
"github.com/go-yaml/yaml"
"github.com/ktr0731/go-fuzzyfinder"
"github.com/pkg/browser"
)
const (
configDir = ".config/fzf-bookmark-opener"
configFileName = "config.yaml"
defaultBookmarks = `bookmarks:
- title: 'fzf-bookmark-opener(You can edit bookmarks to edit "~/.config/fzf-bookmark-opener/config.yaml"!)'
url: 'https://github.com/kyu08/fzf-bookmark-opener'
- title: 'fzf-bookmark-opener Issues'
url: 'https://github.com/kyu08/fzf-bookmark-opener/issues'
- title: 'fzf-bookmark-opener PRs'
url: 'https://github.com/kyu08/fzf-bookmark-opener/pulls'
`
)
type Config struct {
Config []Bookmark `yaml:"bookmarks"`
}
type Bookmark struct {
Title string `yaml:"title"`
Url string `yaml:"url"`
}
func main() {
if 2 < len(os.Args) {
fmt.Println("too many arguments")
return
}
if len(os.Args) == 2 && os.Args[1] == "--version" {
bi, ok := debug.ReadBuildInfo()
if !ok {
return
}
fmt.Println(bi.Main.Version)
return
}
// initで設定ファイルの作成
homeDir, err := os.UserHomeDir()
if err != nil {
fmt.Fprint(os.Stderr, "err")
}
if err := initialize(homeDir); err != nil {
log.Fatal(err)
}
// 設定ファイルの読み込み
bookmarks, err := loadConfig()
if err != nil {
log.Fatal(err)
}
// fzfで選択する
index, err := find(bookmarks)
if err != nil {
return
}
// ブラウザで表示する
if err := browser.OpenURL(bookmarks[index].Url); err != nil {
log.Fatal(err)
}
}
// initialize テスト容易性のために設定ファイルを配置するディレクトリを引数で受け取っている
func initialize(workingDir string) error {
configDirFullPath := path.Join(workingDir, configDir)
// 設定ファイル用ディレクトリの作成
if _, err := os.Stat(configDirFullPath); err != nil {
if err := os.MkdirAll(configDirFullPath, 0o755); err != nil {
return fmt.Errorf("fail: os.MkdirAll: %w", err)
}
fmt.Printf("~%s created.\n", configDirFullPath)
}
// 設定ファイルの作成
configFileFullPath := path.Join(configDirFullPath, configFileName)
if _, err := os.Stat(configFileFullPath); err != nil {
// ファイルが存在していない場合は作成する
if err := os.WriteFile(configFileFullPath, []byte(defaultBookmarks), 0o755); err != nil {
return fmt.Errorf("os.WriteFile: %w", err)
}
fmt.Printf("~%s created.\n", configFileFullPath)
fmt.Println("You can add, update, delete bookmarks to edit `config.yaml`.")
}
return nil
}
func loadConfig() ([]Bookmark, error) {
homeDir, err := os.UserHomeDir()
if err != nil {
log.Fatal("loadConfig os.UserHomeDir err:", err)
}
configFilePath := filepath.Join(homeDir, configDir, configFileName)
b, err := os.ReadFile(configFilePath)
if err != nil {
log.Fatal("loadConfig ioutil.ReadFile err:", err)
}
var c Config
if err := yaml.Unmarshal(b, &c); err != nil {
log.Fatal(err)
}
return c.Config, nil
}
func find(bookmarks []Bookmark) (int, error) {
return fuzzyfinder.Find(
bookmarks,
func(i int) string {
return bookmarks[i].Title
},
)
}