DPM-Core 0.1.2

DPM-Core is for DPM-Server & DPM-Client.
Documentation
# 套件管理工具庫

此工具庫提供管理套件資訊、以 JSON 格式存取數據,以及與套件儲存庫互動的功能。

## 功能

- **PackageInfo**:定義套件的元數據並追蹤其依賴。
- **JsonStorage**:處理 JSON 資料的序列化/反序列化,用於數據持久化。
- **RepoInfo**:管理並查詢儲存庫中的套件元數據。

---

## 結構體與方法

### `Dependency`
代表一個套件的依賴。

**欄位:**
- `name`:依賴的名稱。
- `version`:依賴的版本。

### `PackageInfo`
儲存套件的詳細資訊。

**欄位:**
- `package_name`:套件名稱。
- `file_name`:套件檔案名稱。
- `version`:套件版本。
- `description`:套件描述。
- `hash`:套件檔案的雜湊值。
- `dependencies`:可選的依賴列表。

**方法:**
- `new`:建立一個新的 `PackageInfo` 實例。

### `JsonStorage<T>`
處理 JSON 資料的序列化/反序列化。

**方法:**
- `from_json(path: &Path)`:從 JSON 檔案載入資料。
- `to_json(data: &T, path: &Path)`:將資料存儲為 JSON 檔案。
- `from_url(url: &str)`:從 URL 獲取並反序列化 JSON 資料(異步)。
- `from_str_to(file_contents: &str)`:從字串反序列化 JSON 資料。

### `RepoInfo`
管理一個套件的儲存庫。

**欄位:**
- `packages`:一個 `HashMap`,將套件名稱映射到 `PackageBasicInfo`
**方法:**
- `new()`:建立一個新的 `RepoInfo` 實例。
- `has_package(package_name: &str)`:檢查儲存庫中是否存在指定套件。
- `add_package`:向儲存庫中新增一個套件。
- `add_package_with_info`:使用 `PackageBasicInfo` 實例新增一個套件。
- `get_package`:根據名稱檢索套件資訊。
- `remove_package`:根據名稱移除套件。
- `update_package`:更新已存在的套件資訊。

### `PackageBasicInfo`
簡化版的套件元數據。

**欄位:**
- `url`:套件檔案的 URL。
- `file_name`:套件檔案名稱。
- `version`:套件版本。
- `hash`:套件檔案的雜湊值。
- `dependencies`:可選的依賴列表。

---

## 使用範例

### 基本的 PackageInfo 使用
```rust
use crate::{Dependency, PackageInfo};

let package = PackageInfo::new(
    "example_package".to_string(),
    "example_file".to_string(),
    "1.0.0".to_string(),
    "An example package.".to_string(),
    "abc123".to_string(),
    None,
);
println!("{:?}", package);
```

### 使用 JsonStorage
```rust
use crate::JsonStorage;
use std::path::Path;

let path = Path::new("data.json");
let data = JsonStorage::from_json::<Vec<String>>(path).unwrap();
println!("{:?}", data);
```

### 管理儲存庫
```rust
use crate::{RepoInfo, Dependency};

let mut repo = RepoInfo::new();
repo.add_package(
    "example_package".to_string(),
    "https://example.com/package".to_string(),
    "example_file".to_string(),
    "1.0.0".to_string(),
    "abc123".to_string(),
    None,
);

if repo.has_package("example_package") {
    println!("Package found.");
}
```

---

## 相依套件

此工具庫使用以下 Crate:
- `serde`:用於序列化和反序列化。
- `serde_json`:用於 JSON 操作。
- `anyhow`:用於錯誤處理。
- `reqwest`:用於 HTTP 請求。

---

## 貢獻

歡迎貢獻!隨時提交 Issue 或 Pull Request。

---

## 授權

此專案採用 Apache-2.0 授權條款。詳情請參閱 LICENSE 檔案。