This commit is contained in:
lda
2026-04-04 02:22:54 +07:00 Unverified
parent 3339faebfb
commit b5972196ee
6 changed files with 34 additions and 46 deletions
+5 -5
View File
@@ -6,15 +6,15 @@ use axum::{
use serde::Serialize; use serde::Serialize;
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub struct ApiError { pub struct ApiError<T: Serialize> {
#[serde(skip_serializing, skip_deserializing)] #[serde(skip_serializing, skip_deserializing)]
pub code: StatusCode, pub code: StatusCode,
pub error: String, pub error: T,
} }
impl ApiError { impl<T: Serialize> ApiError<T> {
/// [StatusCode::INTERNAL_SERVER_ERROR] shortcut /// [StatusCode::INTERNAL_SERVER_ERROR] shortcut
pub const fn ise(error: String) -> Self { pub const fn ise(error: T) -> Self {
Self { Self {
code: StatusCode::INTERNAL_SERVER_ERROR, code: StatusCode::INTERNAL_SERVER_ERROR,
error, error,
@@ -22,7 +22,7 @@ impl ApiError {
} }
} }
impl IntoResponse for ApiError { impl<T: Serialize> IntoResponse for ApiError<T> {
fn into_response(self) -> Response { fn into_response(self) -> Response {
(self.code, Json(self)).into_response() (self.code, Json(self)).into_response()
} }
+2 -1
View File
@@ -12,6 +12,7 @@ use crate::route::api::status_redirect;
use crate::route::api::status_smart_redirect; use crate::route::api::status_smart_redirect;
use crate::route::devs::devs_router; use crate::route::devs::devs_router;
use crate::route::dhcp::get_dhcp_leases; use crate::route::dhcp::get_dhcp_leases;
use crate::route::error::ApiError;
use crate::route::status::get_status_json; use crate::route::status::get_status_json;
use crate::route::wake::wake_multi; use crate::route::wake::wake_multi;
@@ -48,7 +49,7 @@ pub fn api_router() -> Router {
"/mac-cache", "/mac-cache",
get(async || match load_mac_name_cache().await { get(async || match load_mac_name_cache().await {
Ok(h) => Json(h).into_response(), Ok(h) => Json(h).into_response(),
Err(e) => e.to_string().into_response(), Err(e) => ApiError::ise(e.to_string()).into_response(),
}), }),
) )
.layer(middleware::from_fn(add_performance_header)) .layer(middleware::from_fn(add_performance_header))
-17
View File
@@ -4,23 +4,6 @@ use crate::route::wake::{
WakeTargetStatus as RouteWakeStatus, WakeTargetStatus as RouteWakeStatus,
}; };
#[derive(Debug, Clone, Copy)]
pub struct Incomplete;
impl TryFrom<RouteWakeTarget> for WakeTarget {
type Error = Incomplete;
fn try_from(value: RouteWakeTarget) -> Result<Self, Self::Error> {
if let RouteWakeTarget {
ip: Some(ip),
mac: Some(mac),
} = value
{
Ok(Self { ip, mac })
} else {
Err(Incomplete)
}
}
}
impl From<WakeTarget> for RouteWakeTarget { impl From<WakeTarget> for RouteWakeTarget {
fn from(WakeTarget { ip, mac }: WakeTarget) -> Self { fn from(WakeTarget { ip, mac }: WakeTarget) -> Self {
+5 -22
View File
@@ -4,8 +4,8 @@ use std::net::IpAddr;
/* use crate::arpparse::IpNeighLine; /* use crate::arpparse::IpNeighLine;
use crate::route::api::Status; */ use crate::route::api::Status; */
use crate::utils::parse::mac;
use crate::utils::wake::wake_one; use crate::utils::wake::wake_one;
use crate::{route::error::ApiError, utils::parse::mac};
use axum::{extract::Json, http::StatusCode, response::IntoResponse}; use axum::{extract::Json, http::StatusCode, response::IntoResponse};
use futures::TryFutureExt; use futures::TryFutureExt;
use macaddr::MacAddr; use macaddr::MacAddr;
@@ -13,12 +13,9 @@ use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none; use serde_with::skip_serializing_none;
use tokio::net::UdpSocket; use tokio::net::UdpSocket;
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Clone)] #[derive(Debug, Default, Serialize, Clone)]
pub struct WakeResult { pub struct WakeResult {
pub success: bool, pub result: Vec<WakeTargetResult>,
pub result: Option<Vec<WakeTargetResult>>,
pub error: Option<String>,
} }
#[skip_serializing_none] #[skip_serializing_none]
#[derive(Debug, Serialize, Clone, Copy)] #[derive(Debug, Serialize, Clone, Copy)]
@@ -50,24 +47,10 @@ pub struct WakeTarget {
pub async fn wake_multi(Json(req): Json<Vec<WakeTarget>>) -> impl IntoResponse { pub async fn wake_multi(Json(req): Json<Vec<WakeTarget>>) -> impl IntoResponse {
match wake_multi_split(req).await { match wake_multi_split(req).await {
Ok(results) => ( Ok(result) => (StatusCode::OK, Json(WakeResult { result })).into_response(),
StatusCode::OK,
Json(WakeResult {
success: true,
result: Some(results),
..Default::default()
}),
),
Err(error) => { Err(error) => {
let error = Some(format!("Error: {}", error)); let error = format!("Error: {}", error);
( ApiError::ise(error).into_response()
StatusCode::INTERNAL_SERVER_ERROR,
Json(WakeResult {
success: false,
error,
..Default::default()
}),
)
} }
} }
} }
+21
View File
@@ -6,6 +6,8 @@ use futures::TryFutureExt;
use macaddr::MacAddr; use macaddr::MacAddr;
use tokio::net::UdpSocket; use tokio::net::UdpSocket;
use crate::route::wake::WakeTarget as RouteWakeTarget;
#[derive(Debug, Clone, Copy, Hash)] #[derive(Debug, Clone, Copy, Hash)]
pub struct WakeTarget { pub struct WakeTarget {
pub ip: IpAddr, pub ip: IpAddr,
@@ -36,6 +38,25 @@ impl WakeTarget {
WakeTargetResult::new(self, WakeStatus::NonexistentAddress) WakeTargetResult::new(self, WakeStatus::NonexistentAddress)
} }
} }
#[derive(Debug, Clone, Copy)]
pub struct Incomplete;
impl TryFrom<RouteWakeTarget> for WakeTarget {
type Error = Incomplete;
fn try_from(value: RouteWakeTarget) -> Result<Self, Self::Error> {
if let RouteWakeTarget {
ip: Some(ip),
mac: Some(mac),
} = value
{
Ok(Self { ip, mac })
} else {
Err(Incomplete)
}
}
}
impl WakeTargetResult { impl WakeTargetResult {
const fn new(target: WakeTarget, status: WakeStatus) -> Self { const fn new(target: WakeTarget, status: WakeStatus) -> Self {
Self { target, status } Self { target, status }
+1 -1
View File
@@ -33,7 +33,7 @@ export async function sendWake(name) {
const j = await r.json(); const j = await r.json();
if (!j.success) { if (j.error) {
elLog.textContent = `wake error: ${j.error}`; elLog.textContent = `wake error: ${j.error}`;
setPill("bad", "error"); setPill("bad", "error");
return; return;