Skip to content

Commit 31430d7

Browse files
committed
Add go files
1 parent ab49df3 commit 31430d7

File tree

5 files changed

+271
-0
lines changed

5 files changed

+271
-0
lines changed

Makefile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
ALFRED_WORKFLOW_PATH ?= ~/Library/Application Support/Alfred 2/Alfred.alfredpreferences/workflows
2+
BUNDLE_ID = "co.randompaper.alfred-qiita-workflow"
3+
PACKAGE_FILE = "info.plist"
4+
5+
run:
6+
go run *.go
7+
8+
link:
9+
TARGET := "$(ALFRED_WORKFLOW_PATH)/$(BUNDLE_ID)"
10+
# mkdir -p "${TARGET}"
11+
# ln -sf "`pwd`", "$(TARGET)"
12+
13+
unlink:
14+
rm "$ALFRED_WORKFLOW_PATH/$BUNDLE_ID"

main.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package main
2+
3+
import (
4+
"github.com/codegangsta/cli"
5+
"os"
6+
)
7+
8+
const (
9+
bundleId = "co.randompaper.alfred-qiita-workflow"
10+
)
11+
12+
func main() {
13+
app := cli.NewApp()
14+
app.Name = "qiita"
15+
// app.Usage = "fight the loneliness!"
16+
app.Commands = []cli.Command{
17+
{
18+
Name: "search",
19+
Action: cmdSearch,
20+
},
21+
}
22+
app.Run(os.Args)
23+
}
24+
25+
func cmdSetToken(c *cli.Context) {
26+
token := c.Args().First()
27+
28+
configPath := "~/Library/Application Support/Alfred 2/Workflow Data/" + bundleId + "/token"
29+
30+
fout, err := os.Create(configPath)
31+
if err != nil {
32+
return
33+
}
34+
defer fout.Close()
35+
36+
fout.WriteString(token)
37+
}

qiita/items.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package qiita
2+
3+
import (
4+
// "fmt"
5+
"net/http"
6+
"time"
7+
)
8+
9+
type ItemsService struct {
10+
client *Client
11+
}
12+
13+
type Item struct {
14+
RenderedBody *string `json:"rendered_body"`
15+
Body *string `json:"body"`
16+
Coediting *bool `json:"coediting"`
17+
CreatedAt *time.Time `json:"created_at"`
18+
Id *string `json:"id"`
19+
Private *bool `json:"private"`
20+
Tags []Tag `json:"tags"`
21+
Title *string `json:"title"`
22+
UpdatedAt *time.Time `json:"updated_at"`
23+
URL *string `json:"url"`
24+
// TODO: User
25+
}
26+
27+
type Tag struct {
28+
Name *string `json:"name"`
29+
Versions []string `json:"versions"`
30+
}
31+
32+
type ItemsListOptions struct {
33+
Query string `url:"query,omitempty"`
34+
ListOptions
35+
}
36+
37+
func (s *ItemsService) List(opt *ItemsListOptions) ([]Item, *http.Response, error) {
38+
u, err := addOptions("items", opt)
39+
if err != nil {
40+
return nil, nil, err
41+
}
42+
req, err := s.client.NewRequest("GET", u, nil)
43+
if err != nil {
44+
return nil, nil, err
45+
}
46+
items := new([]Item)
47+
resp, err := s.client.Do(req, items)
48+
if err != nil {
49+
return nil, resp, err
50+
}
51+
52+
return *items, resp, err
53+
}

qiita/qiita.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package qiita
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"io"
7+
// "io/ioutil"
8+
"fmt"
9+
"github.com/google/go-querystring/query"
10+
"net/http"
11+
"net/url"
12+
"reflect"
13+
)
14+
15+
const (
16+
defaultBaseURL = "https://qiita.com/api/v2/"
17+
userAgent = "go-qiita"
18+
)
19+
20+
type ListOptions struct {
21+
Page int `url:"page,omitempty"`
22+
PerPage int `url:"per_page,omitempty"`
23+
}
24+
25+
type Response struct {
26+
*http.Response
27+
28+
NextPage int
29+
PrevPage int
30+
FirstPage int
31+
LastPage int
32+
}
33+
34+
type Client struct {
35+
client *http.Client
36+
BaseURL *url.URL
37+
UserAgent string
38+
39+
Items *ItemsService
40+
}
41+
42+
func addOptions(s string, opt interface{}) (string, error) {
43+
v := reflect.ValueOf(opt)
44+
if v.Kind() == reflect.Ptr && v.IsNil() {
45+
return s, nil
46+
}
47+
48+
u, err := url.Parse(s)
49+
if err != nil {
50+
return s, err
51+
}
52+
53+
qs, err := query.Values(opt)
54+
if err != nil {
55+
return s, err
56+
}
57+
58+
u.RawQuery = qs.Encode()
59+
return u.String(), nil
60+
}
61+
62+
func NewClient(httpClient *http.Client) *Client {
63+
if httpClient == nil {
64+
httpClient = http.DefaultClient
65+
}
66+
baseURL, _ := url.Parse(defaultBaseURL)
67+
fmt.Println(baseURL)
68+
69+
c := &Client{client: httpClient, BaseURL: baseURL, UserAgent: userAgent}
70+
c.Items = &ItemsService{client: c}
71+
return c
72+
}
73+
74+
func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Request, error) {
75+
rel, err := url.Parse(urlStr)
76+
if err != nil {
77+
return nil, err
78+
}
79+
80+
u := c.BaseURL.ResolveReference(rel)
81+
82+
var buf io.ReadWriter
83+
if body != nil {
84+
buf = new(bytes.Buffer)
85+
err := json.NewEncoder(buf).Encode(body)
86+
if err != nil {
87+
return nil, err
88+
}
89+
}
90+
91+
req, err := http.NewRequest(method, u.String(), buf)
92+
if err != nil {
93+
return nil, err
94+
}
95+
96+
req.Header.Add("Accept", "application/json")
97+
if c.UserAgent != "" {
98+
req.Header.Add("User-Agent", c.UserAgent)
99+
}
100+
return req, nil
101+
}
102+
103+
func (c *Client) Do(req *http.Request, v interface{}) (*http.Response, error) {
104+
resp, err := c.client.Do(req)
105+
if err != nil {
106+
return nil, err
107+
}
108+
109+
defer resp.Body.Close()
110+
111+
// err = CheckResponse(resp)
112+
// if err != nil {
113+
// // even though there was an error, we still return the response
114+
// // in case the caller wants to inspect it further
115+
// return resp, err
116+
// }
117+
118+
if v != nil {
119+
if w, ok := v.(io.Writer); ok {
120+
io.Copy(w, resp.Body)
121+
} else {
122+
err = json.NewDecoder(resp.Body).Decode(v)
123+
}
124+
}
125+
return resp, err
126+
}

search.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package main
2+
3+
import (
4+
"github.com/pascalw/go-alfred"
5+
"fmt"
6+
"github.com/codegangsta/cli"
7+
"github.com/uetchy/alfred-qiita-workflow/qiita"
8+
"golang.org/x/oauth2"
9+
)
10+
11+
func cmdSearch(c *cli.Context) {
12+
query := c.Args().First()
13+
14+
ts := oauth2.StaticTokenSource(
15+
&oauth2.Token{AccessToken: accessToken},
16+
)
17+
tc := oauth2.NewClient(oauth2.NoContext, ts)
18+
client := qiita.NewClient(tc)
19+
20+
// Fetch items
21+
items, _, _ := client.Items.List(&qiita.ItemsListOptions{Query: query})
22+
fmt.Println(*items[0].Title)
23+
24+
// alfred.InitTerms(query)
25+
26+
response := alfred.NewResponse()
27+
28+
for _, item := range items {
29+
// if !alfred.MatchesTerms(query, repo.Name) {
30+
// continue
31+
// }
32+
response.AddItem(&alfred.AlfredResponseItem{
33+
Valid: true,
34+
Uid: *item.Id,
35+
Title: *item.Title,
36+
Arg: *item.URL,
37+
})
38+
}
39+
40+
response.Print()
41+
}

0 commit comments

Comments
 (0)