deanishe/awgo で Alfred の Workflows で動かすスクリプトを実装する

golangalfredproductivity

deanishe/awgo は Alfred の Workflows で動かすスクリプトを実装するためのライブラリ。 NewItem()Script Filter JSON を出力して次の要素に値を渡せるほか keychain を読み書きしたり wf.Args() を呼び workflow:log を引数に渡すことでログを表示する MagicAction を実行したりできる。

デフォルトでは文字が入力される度に実行されるので、API呼び出しの結果などは次のようにキャッシュすると良い。 全てのコードはGitHubにある。

package main

import (
	"flag"
	"fmt"
	aw "github.com/deanishe/awgo"
	"github.com/deanishe/awgo/keychain"
	"logging"
	"time"
)

var (
	wf     *aw.Workflow
	action string
)

const (
	cacheDir            = "./cache"
	cacheKey            = "time"
	actionSetCredential = "set-credential"
	actionLogCredential = "log-credential"
)

func init() {
	wf = aw.New()
	flag.StringVar(&action, "action", "", "action to be executed")
}

func fetchTime() (time.Time, error) {
	cache := aw.NewCache(cacheDir)
	if !cache.Expired(cacheKey, time.Second*20) {
		bytes, err := cache.Load(cacheKey)
		if err != nil {
			return time.Time{}, err
		}
		return time.Parse(time.RFC3339, string(bytes))
	}
	now := time.Now()
	cache.Store(cacheKey, []byte(now.Format(time.RFC3339)))
	return now, nil
}

func run() {
	wf.Args()
	flag.Parse()

	kc := keychain.New("test-alfred-workflow")

	if action == "" {
		wf.NewItem("Set credential").Arg(actionSetCredential, flag.Arg(0)).Valid(len(flag.Arg(0)) > 0)
		wf.NewItem("Log credential").Arg(actionLogCredential).Valid(true)

		t, err := fetchTime()
		if err != nil {
			wf.FatalError(err)
		}
		wf.NewItem(fmt.Sprintf("now: %s, cache: %s", time.Now().Format("15:04:05"), t.Format("15:04:05")))
		wf.SendFeedback()
		return
	}

	switch action {
	case actionSetCredential:
		kc.Set("test", flag.Arg(0))
	case actionLogCredential:
		cred, err := kc.Get("test")
		if err != nil {
			wf.FatalError(err)
		}
		log.Println(fmt.Sprintf("credenital: %s", cred))
	}
	wf.SendFeedback()
}

func main() {
	wf.Run(run)
}

GUI で Workflows を構築して Finder で開くとその設定が含まれる info.plist があるので、これをスクリプトと共に zip で固めることで .alfredworkflow ファイルを作成できる。

build:
	go build -o test-alfred-workflow .

package: build
	zip -r test.alfredworkflow info.plist test-alfred-workflow

install: package
	open test.alfredworkflow

Keyword や実行するコマンドは Script Filter で設定でき、前の要素から渡された値は ./test-alfred-workflow -action “$1” “$2” のようにして参照できる。

参考

deanishe/awgoを使って簡単にAlfred Workflowを作る - ぽよメモ