Go で Neo Cowsay を作った

[Code-Hex/Neo-cowsay - GitHub](https://github.com/Code-Hex/Neo-cowsay)　　[![GitHub stars](https://img.shields.io/github/stars/Code-Hex/Neo-cowsay.svg?style=social&label=Star)](https://github.com/Code-Hex/pget)
> 🐮 cowsay written in Go

Go で cowsay を作ってみました。以前「[高速でダウンロードできるツールを Go で実装した。](http://qiita.com/Kei-Kamikawa/items/d0a500ac387d39a34401)」という記事で、[asciinema](https://asciinema.org/)を使ってターミナル上の様子をキャプチャしたのですが、この時に、「初めに出てくる cowsay の方が気になる」という評価をいただいたことがありました。
この cowsay は [toilet](https://github.com/cacalabs/toilet) というコマンドにパイプを渡して作っていました。

```shell-session
        # Colorful Cowsay using fortune
        function random_cowsay() {
           fortune -s -n 100 | cowsay -f `ls -1 /usr/local/Cellar/cowsay/3.03/share/cows/ | sed s/\.cow// | tail -n +\`echo $(( 1 + (\\\`od -An -N2 -i /dev/random\\\`) % (\\\`ls -1 /usr/local/Cellar/cowsay/3.03/share/cows/ | wc -l\\\`) ))\` |  head -1` | toilet --gay -f term
        }
        if which fortune cowsay >/dev/null; then
            while :
            do
                random_cowsay 2>/dev/null && break
            done
        fi && unset -f random_cowsay
```
このコードを `zshrc` に書き込んで呼び出していました。
このように「ランダムで虹色な cowsay 」を実行するために毎回シェルの起動が重いというのに耐えていたわけですが、そろそろ限界だったので今回上記のような cowsay を作成しました。
# 🐄 パッケージとして使う
何かしらパッケージを作る際に、遊び心で cowsay を実行できるようになるといいなと思い、 cowsay を文字列として受け取れるようにしました。
[README](https://github.com/Code-Hex/Neo-cowsay/blob/master/README.md) にも書いてますが、こんな感じで使うこともできます。

```go
package main

import (
    "fmt"

    cowsay "github.com/Code-Hex/Neo-cowsay"
)

func main() {
    say, err := cowsay.Say(&cowsay.Cow{
        Phrase:      "Hello!!",
        Type:        "default",
        BallonWidth: 40,
    })
    if err != nil {
        panic(err)
    }
    fmt.Println(say)
}
```
# 🐃 コマンドを使う
```
$ cowsay Hello
 _______
< Hello >
 -------
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

```
オリジナルでは不可能だった日本語にも対応してます。[go-runewidth](https://github.com/mattn/go-runewidth) のおかげですね！

```
 ____________________
< 今から講義があります... >
 --------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

```
## ランダムで召喚します
[![asciicast](https://asciinema.org/a/avq390avlf6ddb4jn7d0n0y37.png)](https://asciinema.org/a/avq390avlf6ddb4jn7d0n0y37)
## 虹色(toilet っぽく)、グラデーションカラー([lolcat](https://github.com/busyloop/lolcat)っぽく)、Bold
[![asciicast](https://asciinema.org/a/d3k3a182rsndlgez5sdzhqprk.png)](https://asciinema.org/a/d3k3a182rsndlgez5sdzhqprk)
## 何気に頑張ったスーパー🐮さんモード(マ○オっぽく)
このキャプチャ重いので、実際に動かしたほうが良いです。
[![asciicast](https://asciinema.org/a/crf5crjim1d2nw01ioigug0ks.png)](https://asciinema.org/a/crf5crjim1d2nw01ioigug0ks)

## gopher も喋る！！
```
 ___________
< Go 最高!! >
 -----------
    \ 
     \    ,_---~~~~~----._         
  _,,_,*^____      _____``*g*\"*, 
 / __/ /'     ^.  /      \ ^@q   f 
[  @f | @))    |  | @))   l  0 _/  
 \`/   \~____ / __ \_____/    \   
  |           _l__l_           I   
  |          [______]           I  
  |            | | |            |  
  |             ~ ~             |  
  |                             |   
  |                             |

```
# 🐂 インストール
## パッケージとして

    go get -u github.com/Code-Hex/Neo-cowsay
## cowsay コマンド

    go get -u github.com/Code-Hex/Neo-cowsay/cmd/cowsay
## cowthink コマンド

    go get -u github.com/Code-Hex/Neo-cowsay/cmd/cowthink

# 最後に
動かせれば良いや！という勢いで作ったので Pull Request お待ちしております。是非遊んでみてください！！