feed-parser 2.0.0

A simple RSS 1.0 / RSS 2.0 / Atom feed parser
Documentation
[English]errors.md | **日本語**

# エラー処理

各パーサは `ParseResult<Vec<Feed>>`(`Result<Vec<Feed>, ParseError>` の別名)を返します.
不正な入力はエラーとして返り,panic することはありません.

```rust
use feed_parser::parsers::{errors::ParseError, rss2};

match rss2::parse(document) {
    Ok(feeds) => println!("{} entries", feeds.len()),
    Err(ParseError::MissingField(field)) => eprintln!("entry is missing {field}"),
    Err(e) => eprintln!("could not parse the feed: {e}"),
}
```

## バリアント

`ParseError` は `#[non_exhaustive]` です.そのため `match` にはワイルドカードの腕が必要で,
メジャーバージョンを上げずにバリアントを追加できます.

| バリアント | 返る条件 |
|--|--|
| `XmlParseError` | XML として不正な文書.閉じられていないタグ,対応しない終了タグ,不正な属性など.`quick_xml::Error` を包みます. |
| `DeserializeError` | XML としては正しいが `Feed` に当てはまらないエントリ.典型的には,複数行にまたがる未エスケープのマークアップがテキストフィールドの中に実要素として残った場合.`quick_xml::DeError` を包みます. |
| `MissingField` | エントリに `<title>` が無い,あるいは利用できる `<link>` が無い場合.フィールド名を保持します. |
| `InvalidFeedFormat` | エントリが開いたまま文書が終わった場合.説明文を保持します. |
| `Utf8Error` | 文書に UTF-8 として不正なバイト列が含まれる場合. |
| `IoError` | 正規化した中間 XML の書き出しに失敗した場合. |

## 1件でも壊れていれば文書全体がエラーになる

`parse` は全エントリを返すかエラーを返すかのいずれかです.デシリアライズできないエントリが
1件でもあると,それを読み飛ばすのではなく呼び出し全体が失敗します.部分的な結果を完全な結果と
取り違えないようにするためです.

自分で管理していないフィードで壊れたエントリを許容したい場合は,文書を分割してエントリごとに
解析するか,エラーを match して各アプリケーションにとって妥当な処理へフォールバックしてください.

## エラーは原因を保持する

`ParseError` は `std::error::Error` を実装しているため,他のエラーを包むバリアントは
`source()` からそれを取り出せます.`anyhow` や `eyre`,`?` 演算子とも通常どおり組み合わせられます.

```rust
fn load(document: &str) -> anyhow::Result<Vec<feed_parser::parsers::Feed>> {
    Ok(feed_parser::parsers::rss2::parse(document)?)
}
```