basyura's blog

あしたになったらほんきだす。

golang : redmine のチケットをゲットする

最近は調整とエクセルのメンテばかりでやさぐれているので隙を見ては go の勉強がてらエクセルを生成してみたりチケットの内容をエクセルに反映してみたりしてる。 redmine のチケットのステータスを取りたくてググってみたのだけどサクッと引っかからなかったので書いてみたら案外いけた。未だに作法がよく分かってない。

package main

import (
    "encoding/json"
    "errors"
    "fmt"
    "io/ioutil"
    "net/http"
    "strconv"
)

type Issue struct {
    Id      int    `json:"id"`
    Subject string `json:"subject"`
    Status  Status `json:"status"`
}

type Status struct {
    Id   int    `json:"id"`
    Name string `json:"name"`
}

func main() {

    issue, err := fetch(1)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Printf("#%d %s\n",issue.Id, issue.Subject)
    fmt.Printf("%s (%d)\n", issue.Status.Name, issue.Status.Id)
}

func fetch(id int) (*Issue, error) {
    url := "https://www.redmine.org/issues/" + strconv.Itoa(id) + ".json"
    res, err := http.Get(url)

    if err != nil {
        return nil, err
    }

    bytes, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return nil, err
    }

    dict := map[string]*Issue{}
    if err := json.Unmarshal(bytes, &dict); err != nil {
        return nil, err
    }

    issue, ok := dict["issue"]
    if !ok {
        return nil, errors.New("no ticket")
    }

    return issue, nil
}