如何在Rust中编写管道过滤器?

时间:2014-12-14 21:03:57

标签: rust

管道过滤器是在unix管道之间删除的程序:source | filter | sink。我希望它尽可能少地缓冲,并在处理过程中处理,而不是阅读所有内容,只开始处理EOF上的数据。

我是Rust的新手,这是一个学习项目。整个管道过滤器的目的是让我在命令行上使用字符串处理的脚手架,并且需要从conky获取未经过清理的JSON并为i3bar清理它。

这就是我所拥有的。它不进行任何处理,只应将stdin转储到stdout。

我不确定read_line()是否会阻塞,直到找到换行符,以及如何检查它是否返回了我可以使用的内容。我知道它会返回IoResult,但我无法找到如何对其进行匹配。似乎在这种情况下使用try!宏,但我不确定如何。

当它到达sleep()电话时,它似乎无限期地睡眠。

use std::io;
use std::io::timer;
use std::time::Duration;

fn main() {
    let mut reader = io::stdin();
    let interval = Duration::milliseconds(1000);
    let mut line;

    loop {
        line = reader.read_line();
        print!("{}", line);

        timer::sleep(interval);
    }
}

1 个答案:

答案 0 :(得分:1)

你已经在这里塞了3个(或更多)单独的问题......

  

我不确定read_line()是否会阻塞,直到找到换行符。

docs for read_line在这一点上并不具体,但我认为它不会返回,直到它能够读取整行(或有错误)。

  

如何检查是否返回了我可以使用的内容。我知道它会返回一个IoResult,但我还没有找到如何对付它。

IoResult基本上是Result的另一个名称,这是一个普通的enum。您可以像这样匹配:

match io_method() {
  Ok(_) => thing_1(),
  Err(_) => thing_2(),
}

通常,您可以使用OkErr中的值执行有用的操作。

  

似乎是尝试!在这种情况下使用宏,但我不确定如何。

docs for try!显示它是如何实现的。这是一种简单的说法"如果发生错误,请将该错误返回给我的来电者#34;。在某些时候,您必须决定如何处理错误,但try!表示稍后会处理错误。