Rust やろうぜ!

この記事は [**セゾン情報システムズ Advent Calendar 2020**](https://qiita.com/advent-calendar/2020/sisco) 6日目の記事です。

**Rust がいい感じなのでやりましょう!を言いたい。**

# とりあえず最短で動かす(Windows のみ)
Windows での環境構築手順を説明します。

## インストーラをダウンロードしてインストール
https://www.rust-lang.org/ja/learn/get-started
こちらからインストーラをダウンロードして、インストール。

## インストール確認
インストールが完了したらコマンドプロンプトを開き、以下コマンドを実行して成功するか確認。
`rustc --version`
`cargo --version`

## hello, world
1. 適当なフォルダで `hello.rs` ファイルを作成する
2. エディタでファイルを開き以下を打ち込む

    ```rust
    fn main() {
        println!("Hello, world!");
    }
    ```

3. コマンドプロンプトを開き、ファイルが存在するフォルダに移動する。
4. `rustc hello.rs` を実行
5. 同じフォルダに `hello.exe` が生成されるので、実行する。

## Cargo も使う
実際に開発するときは Cargo をほぼ使います。Cargo はビルドシステム兼パッケージ管理ツールです。
(node.js の npm や、maven の dependencies 的な存在)
1. コマンドプロンプトで適当なフォルダに移動
2. `cargo new hello_cargo` を実行
3. hello_cargo ディレクトリが生成されるので Visual Studio Code でフォルダを開く
→ Cargo.toml(package.json や pom.xml 的なファイル) やソースコードが生成される
4. コマンドプロンプトや vscode のターミナルで `cargo build` を実行
→ target/debug 以下に exe が生成される  
5. `cargo run` で実行できる

# 改めて Rust とは?
- プログラミング言語の一種です。C 言語の細かさと JavaScript の手軽さを併せ持っています。
- コンパイルすることで実行可能なバイナリ(exe)を生成します。なので高速!
- CLIアプリケーション、バックエンドサーバ、Web アプリケーション、WebAssembly など対応範囲が広い。 
- クレート(https://crates.io/) と呼ばれるパッケージ群が豊富
    - npm, maven 的な存在。
- ソースコードフォーマッタ、テストも標準装備。
- 詳しくはドキュメントを!

# 学ぶには?
- まずは公式
    - https://www.rust-lang.org/ja/
- 日本語ドキュメントも充実しています
    - https://doc.rust-jp.rs/
- 言語仕様を一通り学べる入門書
    - https://doc.rust-jp.rs/book-ja/
- サンプルコード集
    - https://doc.rust-jp.rs/rust-by-example-ja/
- 標準ライブラリリファレンス
    - https://doc.rust-lang.org/std/index.html
- ブラウザでコードを書いて動かせる Rust ツアー
    - https://tourofrust.com/00_ja.html
- Qiita にも沢山記事があります
    - https://qiita.com/tags/rust

# サンプル
試しに作った csv を json に変換してみるプログラムです。
Cargo.toml に csv パーサや json を扱うパッケージを追加しています

```:インプットCSV
id,category,name,type
1,プログラミング,Rust,開発
2,プログラミング,TypeScript,開発
3,プログラミング,C++,開発
4,クラウド,AWS,知識
5,クラウド,Azure,知識
6,クラウド,GCP,知識
```

↓

```:アウトプットjson
{
  "categories": [
    "プログラミング",
    "クラウド"
  ],
  "skills": [
    {
      "category": "プログラミング",
      "id": "1",
      "name": "Rust",
      "type": "開発"
    },
    :
    :
    {
      "category": "クラウド",
      "id": "6",
      "name": "GCP",
      "type": "知識"
    }
  ]
}

```

```toml:Cargo.toml
[package]
name = "csv2json"
version = "0.1.0"
authors = ["Yoshihiro-Hirose <--------------------->"]
edition = "2018"

[dependencies]
csv = "1.1.5"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
```

```rust:sample.rs
// #[derive(serde::Serialize, Deserialize, Debug)]
#[derive(Debug, Serialize, Deserialize)]
struct Skill {
    id: String,
    category: String,
    name: String,
    r#type: String,
}

fn example(file: &String) -> Result<(), Box<dyn Error>> {
    let mut rdr = csv::Reader::from_path(file)?;
    let mut categories = HashSet::new();
    let mut skills = vec![];
    for result in rdr.records() {
        let record = result?;

        let category = record.get(1).unwrap();
        categories.insert(category.to_string());

        let skill: Skill = Skill {
            id: record.get(0).unwrap().to_string(),
            category: category.to_string(),
            name: record.get(2).unwrap().to_string(),
            r#type: record.get(3).unwrap().to_string(),
        };
        skills.push(skill)
    }
    let mut master = Map::new();
    master.insert("categories".to_string(), json!(categories));
    master.insert("skills".to_string(), json!(skills));
    let json = serde_json::to_string_pretty(&master)?;
    println!("{}", json);
    Ok(())
}
```

# まとめ
ゆるゆるでしたが以上です。Rust やっていきましょう!
社内の経験者がまだ少なそうなので Rust のラストマンを目指していきます( ･´ｰ･｀)


明日の [**セゾン情報システムズ Advent Calendar 2020**](https://qiita.com/advent-calendar/2020/sisco) もお楽しみに!