Initial commit

This commit is contained in:
Uber Veng
2026-03-14 03:14:59 +07:00
commit f958e704f6
14 changed files with 4477 additions and 0 deletions

29
src/network.rs Normal file
View File

@@ -0,0 +1,29 @@
use crate::error::Result;
use crate::menu::{MenuItem, MenuRoot};
use reqwest::Client;
use serde_path_to_error as path_to_error;
pub async fn fetch_menu(server_url: &str, timeout_sec: u64) -> Result<MenuRoot> {
let client = Client::builder()
.timeout(std::time::Duration::from_secs(timeout_sec))
.build()?;
let resp = client.get(server_url).send().await?;
let text = resp.text().await?;
let mut deserializer = serde_json::Deserializer::from_str(&text);
match path_to_error::deserialize(&mut deserializer) {
Ok(root) => Ok(root),
Err(e) => {
// Если не удалось распарсить как объект с полем "menu",
// пробуем интерпретировать ответ как прямой массив пунктов меню.
match serde_json::from_str::<Vec<MenuItem>>(&text) {
Ok(items) => Ok(MenuRoot {
version: "1.0".to_string(),
menu: items,
}),
Err(_) => Err(crate::error::AppError::Json(e.into_inner())),
}
}
}
}