iphone 0.1.0

Return the latest iPhone model, price (USD), and release date.
Documentation
# iphone

提供两种获取最新版 iPhone 信息的方式:
- `latest()`:离线回退,返回发布时已知的最新版(稳定、无网络)。
- `fetch_latest()`:动态抓取,尝试从 Apple 官方页面解析型号、起售价与发布日期(需要网络)。

## 字段说明
返回结构体:
- `model: String` — 型号,如 `iPhone 17`
- `price_usd: Option<u32>` — 美元起售价(若解析失败则为 `None`)
- `release_date: Option<String>` — 发布会日期(`YYYY-MM-DD`,若解析失败则为 `None`)

## 使用方法
在你的 `Cargo.toml` 中加入:

```toml
[dependencies]
iphone = "0.1"
```

示例(离线回退):
```rust
fn main() {
    let latest = iphone::latest();
    println!(
        "最新 iPhone: {},起售价: {:?},发布日期: {:?}",
        latest.model,
        latest.price_usd,
        latest.release_date,
    );
}
```

示例(动态抓取):
```rust
fn main() {
    match iphone::fetch_latest() {
        Ok(info) => println!(
            "最新 iPhone: {},起售价: {:?},发布日期: {:?}",
            info.model, info.price_usd, info.release_date
        ),
        Err(e) => eprintln!("抓取失败,使用回退: {}", e),
    }
}
```

## 实现思路与局限
- 通过访问 `https://www.apple.com/iphone/` 抽取页面中出现的最大编号 `iPhone XX` 作为最新型号,并匹配 `From $XXX` 作为起售价线索。
- 通过访问 `https://www.apple.com/newsroom/`,就近匹配含有 `iPhone` 的区域周围的 `time[datetime]` 字段,作为发布日期近似值。
- 不同地区/时区/页面变更可能导致解析失败或结果不准确;此时自动回退到 `latest()` 的静态值。
- 若 Apple 页面结构发生改变,解析逻辑可能需要随版本调整。

## 许可证
MIT