RustのFerrisもかわいいけどClippyもかわいいぞ

この記事は「[イエソド アウトプット筋 トレーニング Advent Calendar 2020](https://adventar.org/calendars/5888)」23日目の記事です。


# ferris vs clippy

公式マスコットキャラクターの蟹の[Ferris](https://rustacean.net/)くん。かわいいですね。
数ある言語のマスコットキャラの中で1番好きかもしれません。

<img width="600" alt="rustacean-orig-noshadow.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271259/13c11ba0-aa78-1606-f834-2ab461045d1e.png">

[チュートリアル](https://www.rust-lang.org/learn/get-started#installing-dependencies)でも、このマスコットキャラクターを使ってかわいく標準出力するライブラリ[ferris-says](https://github.com/mgattozzi/ferris-says)が紹介されています。
こんな子がチヤホヤされている裏でライブラリに用意されているのに使用されることのないキャラクター？を見つけてしまったので、今回はそのご紹介。


## 環境

- MacOS Catalina 10.15.7
- Rust v1.48.0
- IntelliJ Ultimate 2020.3
    - [Rust plugin](https://plugins.jetbrains.com/plugin/8182-rust) 0.3.137.3543-203

```terminal
$ rustup -V

rustup 1.23.1 (3df2264a9 2020-11-30)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.48.0 (7eac88abb 2020-11-16)`
```

Rust自体のインストール手順は[こちら](https://www.rust-lang.org/learn/get-started#platform-instructions-unix)
(Windowsの人はdocumentにもある通り、[こちら](https://forge.rust-lang.org/infra/other-installation-methods.html#other-ways-to-install-rustup)を参照)


## 実装

まずはチュートリアル通りにプロジェクトを作成します。

```terminal
$ rustup new hello-rust

    Created binary (application) `hello-rust` package
```

何らかのIDE(今回はIntelliJ)で開きます。

`cargo.toml`に依存を追加します。

```toml:cargo.toml
[package]
name = "hello-rust"
version = "0.1.0"
authors = ["swalowtail62 <example@example.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
ferris-says = "0.2" # 追加
```

`main.rs`も修正します。

```rs:main.rs
use ferris_says::say;
use std::io::{stdout, BufWriter};

fn main() {
    let stdout = stdout();
    let message = String::from("Hello fellow Rustaceans!");
    let width = message.chars().count();

    let mut writer = BufWriter::new(stdout.lock());
    say(message.as_bytes(), width, &mut writer).unwrap();
}
```

これを実行すると、

```terminal
$ cargo run src/main.rs

 __________________________
< Hello fellow Rustaceans! >
 --------------------------
        \
         \
            _~^~^~_
        \) /  o o  \ (/
          '_   -   _'
          / '-----' \
```

ちゃんととてもかわいらしいferrisくんが喋っています。

とてもとてもかわいすぎて内部実装が気になったので[GitHUb](https://github.com/mgattozzi/ferris-says)を調べてみると、[別のキャラクター](https://github.com/mgattozzi/ferris-says/blob/master/src/lib.rs#L26-L38)がいるではありませんか！
チュートリアルでもferrisくんが登場するだけで、日の目を浴びることのないこの子。。使ってあげないとあまりにかわいそうです。

ferrisの代わりに彼を使うには、Rustの[features](https://doc.rust-lang.org/cargo/reference/features.html)を利用すればOKです。早速やってみましょう。

```diff:cargo.toml

[dependencies]
- ferris-says = "0.2"
+ ferris-says = { version = "0.2", features=["clippy"] }
```

先ほどの該当ソースコードを読めばわかりますが、`ferris-says`ライブラリの`features`は[cargo.toml](https://github.com/mgattozzi/ferris-says/blob/master/Cargo.toml#L32)に記載されています。

これで再度実行してみると、

```terminal
$ cargo run src/main.rs

 __________________________
< Hello fellow Rustaceans! >
 --------------------------
        \
         \
            __
           /  \
           |  |
           @  @
           |  |
           || |/
           || ||
           |\_/|
           \___/
```

。。。あまりかわいくはありませんね。
やっぱり王道のferrisくんしか勝たんですね。

---

↑のが正式に`clippy`という名前のキャラクターなのかは分かりません。勝手に呼んでいます。
Rustで`clippy`というと、[lintライブラリ](https://github.com/rust-lang/rust-clippy)が連想されると思います。果たしてこのライブラリのキャラクターということなのか、、？