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” のようにして参照できる。