use apidoc_core::error::{ApiErrorItem, ApiErrors};
use syn::{parse_quote, DeriveInput};
#[test]
fn test_expand() {
pub enum Error {
UserNotExist,
NoPermission,
BadRequest,
Error2(Error2),
}
let _e = Error::UserNotExist;
let _e = Error::NoPermission;
let _e = Error::BadRequest;
let _e = Error::Error2(Error2);
pub struct Error2;
pub enum ErrorKind {
BadRequest,
}
impl From<ErrorKind> for ApiErrorItem {
fn from(_value: ErrorKind) -> Self {
todo!()
}
}
impl ApiErrors for Error2 {
fn api_errors() -> Vec<ApiErrorItem> {
let result = vec![
ApiErrorItem {
status: 200,
code: "001".into(),
cause: "用户不存在".into(),
},
ApiErrorItem {
status: 200,
code: "002".into(),
cause: "没有权限".into(),
},
ErrorKind::BadRequest.into(),
{
let item: ApiErrorItem = ErrorKind::BadRequest.into();
ApiErrorItem {
status: item.status,
code: item.code,
cause: "错误请求".into(),
}
},
];
result
}
}
impl ApiErrors for Error {
fn api_errors() -> Vec<ApiErrorItem> {
let mut result = vec![
ApiErrorItem {
status: 200,
code: "001".into(),
cause: "用户不存在".into(),
},
ApiErrorItem {
status: 200,
code: "002".into(),
cause: "没有权限".into(),
},
ErrorKind::BadRequest.into(),
{
let item: ApiErrorItem = ErrorKind::BadRequest.into();
ApiErrorItem {
status: item.status,
code: item.code,
cause: "错误请求".into(),
}
},
];
result.extend(<Error2 as ApiErrors>::api_errors());
result
}
}
let input: DeriveInput = parse_quote! {
#[derive(ApiError)]
pub enum Error {
#[api_error(status = 200, code = "001", cause = "用户不存在")]
UserNotExist,
#[api_error("002", "没有权限")]
NoPermission,
#[api_error(from(ErrorKind::BadRequest))]
BadRequest,
#[api_error(from(ErrorKind::BadRequest, "错误请求"))]
BadRequest2,
Error2(Error2),
}
};
let result = apidoc_expand::api_error::expand(&input)
.unwrap()
.to_string();
println!("{result}")
}