Exodusで簡単scaffolding(Rust+nickelフレームワーク+PostgreSQLでAngular.jsのSPAのscaffolding)

# はじめに。

以下の記事です。

- Rust(言語)
- Cargo(パッケージ管理ツール)
- nickel(Webフレームワーク)
- PostgreSQL(DB)
- Angular.js(JS)

# まえがき
時代はSPA（シングルページアプリケーション）らしい。
あと、ReactJSではなくてごめんなさい。Angular.jsです。
そこで、自動SPAのscaffoldingツールExodus（エクソダス）を使おう。
みなさんはそんなの知らないと思います。
そうですよね。なぜなら私が勝ったに作ったから。
コマンドでSPAのscaffolding（土台）を作ってくれる。
`gulp`とかはいりません。`npm`のインストール自体もいりません。

## 名前の由来（興味ない人は読み飛ばしてもいい）

Exodusはモーセが主役の出エジプト記です。
僕のアイコンがモーセなのと、単にかっこいいからそうしました。

## 要件定義
- Mac OS X
- Rust
- Nickel
- Cargo インストール前提

## インストール
```
brew tap shinriyo/exodus
brew install exodus
```
*公式brewではないのでtapが必要。*

### 一応brewのgithub晒しておきます。
`install`コマンドの駄目だしをするならここに`pull request`してね。

https://github.com/shinriyo/homebrew-exodus

こちら本体
https://github.com/shinriyo/exodus.rs

## 使い方

使いたいところのnickelフレームワークでのプロジェクトの中でコマンドを打ちます。
`src`とかのフォルダあるところで行ってね。

1. まだプロジェクト無かったら以下のコマンドを入力。（`hoge`プロジェクトが生成される）
```
 cargo new hoge --bin
```

2. `hoge`プロジェクトに入ります。
```
cd hoge
```

3. exodusの初期化コマンドを行う。
```
exodus init
```

このコマンドはプロジェクトで**一度**でいいです。
生成に失敗したらまた行ってね。


すると以下のメッセージが出るはず。

```
Initialize....
Generated template in src/main.rs.
Generated AngularJS libraries.
Finish initialize.
You shall take [dependencies] of the Cargo.toml your project.

[dependencies]
nickel = "*"
postgres = "0.11"
openssl = "*"
rustc-serialize = "*"
hyper = "*"
```

## あら不思議！以下のものが生成されます
※`gulp`を使ってる人はこのありがたみわからないかも？

```
$ ls src
main.rs
$ ls app/assets/css                                                                                                                                              
app.css           bootstrap.min.css
$ ls app/assets/lib                                                                                                                                               
angular-resource.min.js  angular-ui-router.min.js angular.min.js
```
まぁこんな感じで`css`とか`AngularJS`のファイル類など”僕が”動作保証しているものをとってきます。
最新版とかではないですよ。
コマンドまだ入れるのためらってる人、以下のgithubのような構成になります。
https://github.com/shinriyo/nickel-helloworld

さてさて、先ほどのこのメッセージをお読みになっただろうか？

```
You shall take [dependencies] of the Cargo.toml your project.

[dependencies]
nickel = "*"
postgres = "0.11"
openssl = "*"
rustc-serialize = "*"
hyper = "*"
```

これはモーセの十戒の英語のパロディーですよ。
あなたの`Cargo.toml`に`[dependencies]`の内容を追記してねってこと。

そうしたら準備OK.

## モデルの生成

どっかで見たようなコマンドでしょうか？
<del>そうです。Railsのパクリです。 :bowtie: </del>
```
exodus g movie name:string price:integer description:text
```

そうすれば、以下にファイルが生成されていることを確認できる。
※`string`も`text`も結局は両方共同じものができます。

```
src/movie/mod.rs
```

このように定義されているでしょうか？
気に入らなければ後でご自身で修正してね。
```
struct Movie {
    _id: Option<i32>,
    name: String, price: i16, description: String
}
```

## モデルの生成後のmainへの追記

何を追記するのでしょうか？
実は先程の生成時に見ましたね。

```
Generate Scaffolding....
[Success] Scaffolding.
You shall add 'mod movie;' against your src/main.rs.
You shall add 'movie::url(shared_connection.clone(), &mut router);' against your src/main.rs.
Run 'cargo run' commandment.
```

はい、これもモーセの十戒のパロディーですよ。
要は`src/main.rs`に
`mod movie;`
をmain()の上の`// later you add module there!`の下にに追記。

`movie::url(shared_connection.clone(), &mut router);`
を`// later you add scaffolding url there!`のところの下に追記しよう。

## サーバ起動

```
cargo run
```
で起動。
最初はbuildが行われるので時間かかります。
ビルドだけしたい人は
```
cargo build
```
まぁnickelの時と同じですね。

```
Running `target/debug/hoge`
Listening on http://[::1]:6767
Ctrl-C to shutdown server
```
がコンソールに出たらWebアクセスはOK。

## DBのテーブル初期化

Djangoでいうsyncdb的なことをやりますが、コマンドではなくこれはアクセするだけ。
簡単でしょう！<del>コマンド作るのがめんどくさかった</del>
単に`http://localhost:6767/setup/movie`にアクセスするだけです。

PostgreSQLの起動忘れずに！

`postgres -D /usr/local/var/postgres`

URLは`http://localhost:6767/setup/モデル名`という規則になってます。
1度しか作れないのでもし、以下のメッセージが出れば2つ作れないよー的なエラーなので無視して完了。
```
Error running query: Db(DbError { severity: "ERROR", code: DuplicateTable, message: "relation \"movie\" already exists", detail: None, hint: None, position: None, where_: None, schema: None, table: None, column: None, datatype: None, constraint: None, file: "heap.c", line: 1056, routine: "heap_create_with_catalog" })
```


## アクセス
以下にアクセスしてくだい。

http://localhost:6767/movie_app

追加や削除や編集ができますよ。

## あとがき

※気に入った方はプルリクしてみたら変わるかも？
英語でも日本語でも韓国語でも質問受け付けます。
https://github.com/shinriyo/exodus.rs

※今後Python（Django）やGo（beego）とかにも対応するかも？もうAngularJS自体オワコンらしいのでReactにするかも？