成果物
gifのようにするには以下のコマンド(alias貼らないと実用的じゃない)
$ bookmark-go show | fzf | bookmark-go open
課題感
- アクセスしたいウェブページへのアクセス方法がバラバラ(slackの履歴からやscrapboxのwikiページからなど)でブラウザで表示するまでに時間がかかる
- chromeの履歴に残ってたりするけどヒットできなかったりする
- chromeのブックマークも良いけどgui操作がちょっと萎える
要件
実装
簡単に実装を紹介します
cobraというcliアプリ向けのパッケージを使いました
k8sやgithub cliにも使われているみたいです
基本的にcobraのチューリアルに沿って実装しました
mainは極薄でcmd以下にコマンドを追加していく実装です
main.go
package main
import "bookmark-go/cmd"
func main() {
cmd.Execute()
}
以下のようにroot cmdを宣言してmainから呼んでいます
rootCmd.AddCommandでコマンドを追加できる
cmd/root.go
package cmd
// 省略
func Execute() {
all := []*cobra.Command{
addCmd,
indexCmd,
deleteCmd,
openCmd,
}
for _, c := range all {
rootCmd.AddCommand(c)
}
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
各cmdは以下にあるような感じ
urlを開くcmdは受け取ったidでdbから検索してexec.Commandで開いているだけ
open.go
package cmd
//省略
var openCmd = &cobra.Command{
Use: "open",
Short: "open url",
Long: `open url`,
Run: open,
}
func open(cmd *cobra.Command, args []string) {
db := db.NewDB()
defer db.Close()
var u models.URL
var s string
if id == "" {
cli.GetInput("id", &s)
items := strings.Fields(s)
if len(items) == 0 {
return
}
id = items[0]
}
err := db.Where("id = ?", id).First(&u).Error
if err != nil {
log.Fatal(err)
}
fmt.Printf("open %v¥n", u.Url)
exec.Command("open", u.Url).Run()
u.LastVisitAt = time.Now()
err = db.Save(&u).Error
if err != nil {
log.Fatal(err)
}
}
学んだこと
- 標準入出力はパイプを使うとめちゃくちゃ可能性を秘めていると感じた
- シェル極めたい
- Goとsqliteで簡単にcliツール作れるから良い感じ
- もっと色々cliツール作りたいと思った
TODO
- テスト書く