perl のプログラムを go に移植してみて

気が向いたので fujiwara さんが以前作った Urume のクライアントである mezasi という perl で書かれたものを go に移植してみた。

https://github.com/soh335/go-mezasi

以下感想

  • サブコマンドの仕組みは github.com/gonuts/commander と github.com/gonuts/flag を使った。
  • useragent とかを固定化したいとなると下みたいに http.Client の簡単なラッパーを書くのが良い?
package main

import (
    "io"
    "net"
    "net/http"
    "net/url"
    "time"
)

type Client struct {
    UserAgent string
    client    *http.Client
    EndPoint  *url.URL
}

func NewClient(endpoint *url.URL) *Client {
    return &Client{
        UserAgent: "Mezasi/0.1",
        client: &http.Client{
            Transport: &http.Transport{
                Dial: func(netw, addr string) (net.Conn, error) {
                    return net.DialTimeout(netw, addr, time.Duration(time.Second*300))
                },
            },
        },
        EndPoint: endpoint,
    }
}

func (c *Client) Do(req *http.Request) (*http.Response, error) {
    return c.client.Do(req)
}

func (c *Client) NewRequest(method string, pathStr string, body io.Reader) (*http.Request, error) {
    urlPath, err := url.Parse(pathStr)
    if err != nil {
        return nil, err
    }
    u := c.EndPoint.ResolveReference(urlPath)
    req, err := http.NewRequest(method, u.String(), body)
    if err != nil {
        return nil, err
    }
    req.Header.Add("User-Agent", c.UserAgent)
    return req, nil
}

こんな感じでタイムアウトの処理と、request object を作るメソッド、実行するメソッドを用意した。 request object を作るときに endpoint をもとに url を作ったり、 user-agent の追加をしたりした。

  • 起動が早い