## 経緯
以下の記事で興味を持ったので[[ezio]]をいじってみた。
<div class="link-card">
<div class="link-card-header">
<img src="https://blog-dry.com/icon/link" class="link-card-site-icon"/>
<span class="link-card-site-name">Don't Repeat Yourself</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">「ちょい使い」に便利なIOクレート ezio - Don't Repeat Yourself</p>
</div>
<div class="link-card-description">
Rust を使っているとどうしても思い出しながらでないと書けないものに標準入力、ファイルの読み書きがあります。というのも、Web アプリケーションを作るソフトウェアエンジニア(私)の場合日常業務でそこ...
</div>
</div>
<img src="https://ogimage.blog.st-hatena.com/8599973812298536260/13574176438062188662/1644548259" class="link-card-image" />
</div>
<a href="https://blog-dry.com/entry/2022/02/11/114624"></a>
</div>
## プロジェクト作成
```console
cargo new easy-grep
```
[[Cargo.toml]]に追加。
```toml
[dependencies]
ezio = "0.1.2"
```
## 標準入力をprintするコード
かなりシンプル。
```rust
use ezio::stdio;
fn main() {
let stdin = stdio::read_line();
println!("{}", stdin);
}
```
```console
$ echo hoge | cargo run -q
hoge
```
## 任意のファイルをprintするコード
こちらもシンプル。
```rust
use ezio::file;
fn main() {
let cargo_toml = file::read("./Cargo.toml");
println!("{}", cargo_toml);
}
```
```console
$ cargo run -q
[package]
name = "easy-grep"
version = "0.1.0"
edition = "2021"
publish = ["artifactory"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
ezio = "0.1.2"
```
普通に書いても `unwrap()` が必要なこと以外はそこまで大差ない。
```rust
use std::fs::read_to_string;
fn main() {
let cargo_toml = read_to_string("./Cargo.toml").unwrap();
println!("{}", cargo_toml);
}
```
## 標準入力をgrepするコード
```console
cat Cargo.toml | cargo run -q " = "
```
で[[grep]]のように動くコードを書こうとした。
```rust
use ezio::prelude::*;
use std::env;
fn main() {
// unsafe
let word = &env::args().collect::<Vec<String>>()[1];
stdio::read_line()
.lines()
.filter(|&l| l.contains(word))
.for_each(|l| println!("{:?}", l));
}
```
ところが`stdio::read_line()`は改行に対応してなさそうなため無理だった。