From 2413afbc47ff81ae86bbd5f67da3d648f2bc9fbb Mon Sep 17 00:00:00 2001 From: Super User Date: Wed, 19 Mar 2025 11:23:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=83=A8=E5=88=86=E7=9A=84apidoc.rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/apidoc_generator.rs | 157 ++++++++++++++++++++++++++++++----- 1 file changed, 136 insertions(+), 21 deletions(-) diff --git a/examples/apidoc_generator.rs b/examples/apidoc_generator.rs index 32ad96c..2f56e27 100644 --- a/examples/apidoc_generator.rs +++ b/examples/apidoc_generator.rs @@ -1,6 +1,3 @@ -use std::collections::HashMap; -use fleetmodv2::resources::models::{Container, EnvVar, HostPathVolume, Metadata, Pod, PodSpec, Port, Probe, ResourceRequirements, SecurityContext, TcpSocketAction, Volume, VolumeMount}; - /** * Copyright (2024, ) Institute of Software, Chinese Academy of Sciences * author: wuheng@iscas.ac.cn @@ -8,10 +5,12 @@ use fleetmodv2::resources::models::{Container, EnvVar, HostPathVolume, Metadata, * **/ - +use std::collections::HashMap; +use fleetmodv2::resources::models::{Container, EnvVar, HostPathVolume, Metadata, Pod, PodSpec, Port, Probe, ResourceRequirements, SecurityContext, TcpSocketAction, Volume, VolumeMount}; +use serde_json::{json, Value}; macro_rules! apidoc { - ($name:expr, $method:expr, $path:expr, $req_headers:expr, $req_body:expr, $resp_headers:expr, $resp_body:expr) => {{ + (body_required $name:expr, $method:expr, $path:expr, $req_headers:expr, $req_body:expr, $resp_headers:expr, $resp_body:expr) => {{ // 构建 API 文档字符串 let mut doc = String::new(); @@ -56,6 +55,53 @@ macro_rules! apidoc { doc.push_str(&format!("{}\n", resp_json)); doc.push_str("```\n"); + // 返回生成的文档字符串 + doc + }}; + + (body_unrequired $name:expr, $method:expr, $path:expr, $req_headers:expr, $resp_headers:expr, $resp_body:expr) => {{ + // 构建 API 文档字符串 + let mut doc = String::new(); + + // 添加 API 名称 + doc.push_str(&format!("## {}\n", $name)); + + // 添加请求方法 + doc.push_str(&format!("请求方法:{}\n", $method)); + + // 添加请求路径 + doc.push_str(&format!("请求路径:{}\n", $path)); + + // 添加请求内容 + doc.push_str("请求内容:\n"); + + // 添加请求头 + doc.push_str("headers:\n```\n"); + for (key, value) in $req_headers { + doc.push_str(&format!("{}: {}\n", key, value)); + } + doc.push_str("```\n"); + + // 添加请求体 + doc.push_str("body:\n```\n"); + doc.push_str("```\n"); + + // 添加返回结果 + doc.push_str("返回结果:\n"); + + // 添加响应头 + doc.push_str("headers:\n```\n"); + for (key, value) in $resp_headers { + doc.push_str(&format!("{}: {}\n", key, value)); + } + doc.push_str("```\n"); + + // 添加响应体 + doc.push_str("body:\n```json\n"); + let resp_json = serde_json::to_string_pretty(&$resp_body).unwrap(); + doc.push_str(&format!("{}\n", resp_json)); + doc.push_str("```\n"); + // 返回生成的文档字符串 doc }}; @@ -102,35 +148,43 @@ fn resp_headers(resp_type: crate::ResponseHeader) -> HashMap { fn main() { - let mut api_doc = String::new(); // 使用宏生成 API 文档(名称,方法,路径,请求类型,返回类型,对象) - api_doc.push_str(&apidoc!("创建指定资源", "post", "/resource/create/{version}/{plural}", + api_doc.push_str(&apidoc!( + body_required + "创建指定资源", "post", "/resource/create/{version}/{plural}", req_headers(RequestHeader::JSON), request_pod(), resp_headers(ResponseHeader::JSON), response_pod())); - api_doc.push_str(&apidoc!("删除指定资源", "delete", "/resource/delete/{version}/{plural}/{name}", + api_doc.push_str(&apidoc!( + body_unrequired + "删除指定资源", "delete", "/resource/delete/{version}/{plural}/{name}", req_headers(RequestHeader::NONE), - request_pod(), - resp_headers(ResponseHeader::JSON), + resp_headers(ResponseHeader::JSON), response_pod())); - api_doc.push_str(&apidoc!("更新指定资源", "put", "/resource/update/{version}/{plural}/{name}", + api_doc.push_str(&apidoc!( + body_required + "更新指定资源", "put", "/resource/update/{version}/{plural}/{name}", req_headers(RequestHeader::JSON), - request_pod(), + request_update_pod(), resp_headers(ResponseHeader::JSON), - response_pod())); - api_doc.push_str(&apidoc!("获取单一资源", "get", "/resource/get/{version}/{plural}/{name}", + response_updated_pod())); + api_doc.push_str(&apidoc!( + body_unrequired + "获取单一资源", "get", "/resource/get/{version}/{plural}/{name}", req_headers(RequestHeader::NONE), - request_pod(), resp_headers(ResponseHeader::JSON), response_pod())); - api_doc.push_str(&apidoc!("获多个资源", "get", "/resource/get/{version}/{plural}", + api_doc.push_str(&apidoc!( + body_unrequired + "获多个资源", "get", "/resource/get/{version}/{plural}", req_headers(RequestHeader::NONE), - request_pod(), resp_headers(ResponseHeader::JSON), - response_pod())); - api_doc.push_str(&apidoc!("修改指定资源", "patch", "/resource/patch/{version}/{plural}/{name}", + response_list_pod())); + api_doc.push_str(&apidoc!( + body_required + "修改指定资源", "patch", "/resource/patch/{version}/{plural}/{name}", req_headers(RequestHeader::JSON), request_pod(), resp_headers(ResponseHeader::JSON), @@ -150,17 +204,70 @@ pub fn request_pod() -> Pod { pod } -pub fn response_pod() -> Pod { +pub fn request_update_pod() -> Pod { let pod = Pod { api_version: "v1".to_string(), kind: "Pod".to_string(), - metadata: pod_metadata(), + metadata: pod_updated_metadata(), spec: pod_spec(), status: None, }; pod } +pub fn response_pod() -> Value { + let pod = Pod { + api_version: "v1".to_string(), + kind: "Pod".to_string(), + metadata: pod_metadata(), + spec: pod_spec(), + status: None, + }; + json!( + { + "status_code": "OK", + "message": "success", + "data": pod + } + ) +} + +pub fn response_list_pod() -> Value { + let pod = Pod { + api_version: "v1".to_string(), + kind: "Pod".to_string(), + metadata: pod_metadata(), + spec: pod_spec(), + status: None, + }; + json!( + { + "status_code": "OK", + "message": "success", + "data": [ + pod, + ] + } + ) +} + +pub fn response_updated_pod() -> Value { + let pod = Pod { + api_version: "v1".to_string(), + kind: "Pod".to_string(), + metadata: pod_updated_metadata(), + spec: pod_spec(), + status: None, + }; + json!( + { + "status_code": "OK", + "message": "success", + "data": pod + } + ) +} + fn pod_spec() -> Option { Some(PodSpec { node_name: Some("node_name".to_string()), @@ -263,4 +370,12 @@ fn pod_metadata() -> Option { uid: Some("85bb7057-a2e2-46d5-bcca-626c350d9e35".to_string()), ..Default::default() }) +} + +fn pod_updated_metadata() -> Option { + Some(Metadata { + name: "pod-example-updated".to_string(), + uid: Some("85bb7057-a2e2-46d5-bcca-626c350d9e35".to_string()), + ..Default::default() + }) } \ No newline at end of file -- Gitee From a45e3b087df51209d979c6e79dadb6177ce301a0 Mon Sep 17 00:00:00 2001 From: Yuichi <913637919@qq.com> Date: Wed, 19 Mar 2025 14:16:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E9=95=BF=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=E7=9A=84data?= =?UTF-8?q?=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cores/servers/actix_web/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cores/servers/actix_web/mod.rs b/src/cores/servers/actix_web/mod.rs index e6c4321..54c41dc 100644 --- a/src/cores/servers/actix_web/mod.rs +++ b/src/cores/servers/actix_web/mod.rs @@ -263,7 +263,7 @@ macro_rules! define_json_stream_response_method { match serde_json::to_string(&value) { Ok(json) => { // 格式化为 SSE 的 data 字段,注意末尾的两个换行符 - let data = format!("data: {}\n\n", json); + let data = format!("{}\n\n", json); Ok(Bytes::from(data)) } Err(e) => { @@ -308,7 +308,7 @@ macro_rules! define_json_stream_response_method { match serde_json::to_string(&value) { Ok(json) => { // 格式化为 SSE 的 data 字段,注意末尾的两个换行符 - let data = format!("data: {}\n\n", json); + let data = format!("{}\n\n", json); Ok(Bytes::from(data)) } Err(e) => { -- Gitee