swagger gin 文档接口排序,写了一个小工具,自定义接口排序

起因没找到swagger 自定义接口排序

代码原理就是替换 swag init 生成的docs.go paths 部分 ,取到swagger.json paths 部分排序,正则匹配docs.go paths 部分,然后通过自定义排序,替换paths部分,这个根据自定义的需求来

代码如下

package mainimport ("encoding/json""fmt""github.com/tidwall/gjson"orderedmap "github.com/wk8/go-ordered-map/v2""log""os""regexp""sort""strconv""strings"
)// GOOS=darwin GOARCH=arm64 go build -x -v -ldflags "-s -w" -o swagger_sort main.go
type Endpoint struct {Post struct {Security    []map[string][]interface{} `json:"security"`Description string                     `json:"description"`Consumes    []string                   `json:"consumes"`Produces    []string                   `json:"produces"`Tags        []string                   `json:"tags"`Summary     string                     `json:"summary"`Parameters  []map[string]interface{}   `json:"parameters"`Responses   map[string]interface{}     `json:"responses"`} `json:"post"`
}func main() {goPath := os.Args[1]swaggerPath := os.Args[2]if goPath == "" || swaggerPath == "" {log.Fatal("文件不存在")return}// 从doc.go中读取内容content, err := os.ReadFile(goPath)if err != nil {log.Fatalf("Error reading docs.go: %v", err)}newPathsContent := getNewContents(swaggerPath)// 正则匹配 "paths" 及其后面的 {} 内容,但保留 "definitions"r := regexp.MustCompile(`(?s)"paths": (\{.*?\}),\s*"definitions"`)matches := r.FindStringSubmatch(string(content))if matches == nil {fmt.Println("No match found!")return}//fmt.Println("Matched:", matches[1])// Replace matched content in docs.go with newPathsContentupdatedContent := string(content)updatedContent = strings.Replace(updatedContent, matches[1], newPathsContent, 1)// Write the updated content back to docs.goerr = os.WriteFile(goPath, []byte(updatedContent), 0644)if err != nil {log.Fatalf("Error writing to docs.go: %v", err)}fmt.Println("Successfully wrote to test.js and updated docs.go!")
}func extractNumberFromSummary(summary string) int {parts := strings.Split(summary, ".")if len(parts) > 0 {num, err := strconv.Atoi(parts[0])if err == nil {return num}}return 0
}func getNewContents(swaggerPath string) string {content, err := os.ReadFile(swaggerPath)if err != nil {log.Fatalf("Error reading swagger.json: %v", err)}str := gjson.Get(string(content), "paths").String()var data map[string]Endpointif err := json.Unmarshal([]byte(str), &data); err != nil {panic(err)}type PathItem struct {Path stringEp   Endpoint}var paths []PathItemfor k, v := range data {paths = append(paths, PathItem{k, v})}sort.Slice(paths, func(i, j int) bool {if len(paths[i].Ep.Post.Tags) > 0 {if paths[i].Ep.Post.Tags[0] == paths[j].Ep.Post.Tags[0] {numI := extractNumberFromSummary(paths[i].Ep.Post.Summary)numJ := extractNumberFromSummary(paths[j].Ep.Post.Summary)return numI < numJ} else if strings.Contains(paths[i].Ep.Post.Tags[0], "测试") {return false} else {return true}}return true})//bytePath, _ := json.MarshalIndent(paths, "", "    ")//fmt.Println(string(bytePath))// 创建一个新的 ordered maporderedData := orderedmap.New[string, Endpoint]()// 从排序后的切片中填充 ordered mapfor _, item := range paths {orderedData.Set(item.Path, item.Ep)}// 编码 ordered mapsortedJSON, err := json.MarshalIndent(orderedData, "", "    ")if err != nil {panic(err)}fmt.Println(string(sortedJSON))return string(sortedJSON)
}

我的排序效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144998.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USB学习(1):USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式

连接计算机外围设备最简单的方法是通过USB(通用串行总线)。USB是即插即用接口&#xff0c;可以将扫描仪、打印机、数码相机、闪存驱动器等计算机外围设备连接到计算机上。本篇文章就来介绍一下USB的一些基础知识&#xff0c;包括。 文章目录 1 接口类型和标准规范2 引脚分布3 …

Flutter的Don‘t use ‘BuildContext‘s across async gaps警告解决方法

文章目录 问题有问题的源码 问题原因问题分析Context的含义BuildContext的作用特殊情况 解决方法 问题 Flutter开发中遇到Don’t use BuildContext’s across async gaps警告 有问题的源码 if (await databaseHelper.isDataExist(task.title)) {showDialog(context: context,…

大语言模型(LLM)综述(二):开发大语言模型的公开可用资源

A Survey of Large Language Models 前言3. RESOURCES OF LLMS3.1 公开可用的模型CheckPoints或 API3.2 常用语料库3.3 库资源 前言 随着人工智能和机器学习领域的迅速发展&#xff0c;语言模型已经从简单的词袋模型&#xff08;Bag-of-Words&#xff09;和N-gram模型演变为更…

idea的debug调试

目录 断点条件设置(condition) 断点表达式(evaluate expression) 断点回退(reset frame) 断点条件设置(condition) 条件断点&#xff0c;一般是满足我们设置的某个条件时&#xff0c;debug断点才会生效。这种条件断点设置&#xff0c;我们一般用在多重循环中。 这儿我们以li…

【C语言小游戏--猜数字】

文章目录 前言1.游戏描述2.代码实现2.1打印菜单2.2构建基础框架2.3玩游戏2.3.1生成随机数2.3.1.1rand()2.3.1.2srand()2.3.1.3time() 2.3.2game() 2.4自己设定猜的次数 3.完整代码 前言 猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏&#xff0c;下…

如何处理前端文件上传?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【网络编程】应用层——HTTP协议

文章目录 一、HTTP协议简介二、认识URL三、HTTP协议格式1. HTTP请求协议格式2. HTTP响应协议格式 三、构建HTTP请求和响应四、HTTP的方法五、HTTP的状态码六、HTTP常见的Header七、Cookie和Session 一、HTTP协议简介 HTTP 协议 是 Hyper Text Transfer Protocol&#xff08;超文…

专业安卓实时投屏软件:极限投屏(QtScrcpy作者开发)使用说明

基本介绍 极限投屏是一款批量投屏管理安卓设备的软件&#xff0c;是QtScrcpy作者基于QtScrcpyCore开发&#xff0c;主要功能有&#xff1a; 设备投屏&控制&#xff1a;单个控制、批量控制分组管理wifi投屏adb shell快捷指令文件传输、apk安装 更多功能还在持续更新。 极…

手把手创建属于自己的ASP.NET Croe Web API项目

第一步&#xff1a;创建项目的时候选择ASP.NET Croe Web API 点击下一步&#xff0c;然后配置&#xff1a; 下一步&#xff1a;

『C++ - 模板』之模板进阶

文章目录 模板进阶非类型模板参数类型模板参数与非类型模板参数的不同 模板的特化全特化偏特化全特化与偏特化的区别 模板的分离编译解决办法 总结 模板进阶 非类型模板参数 类型模板参数与非类型模板参数的不同 类型模板参数非类型模板参数 ​ 类型模板参数一般用来设置模…

RK3568平台 GPIO子系统框架

一.gpio 子系统简介 gpio 子系统顾名思义&#xff0c;就是用于初始化 GPIO 并且提供相应的 API 函数&#xff0c;比如设置 GPIO为输入输出&#xff0c;读取 GPIO 的值等。gpio 子系统的主要目的就是方便驱动开发者使用 gpio&#xff0c;驱动 开发者在设备树中添加 gpio 相关信…

互联网Java工程师面试题·Java 面试篇·第五弹

目录 79、适配器模式和装饰器模式有什么区别&#xff1f; 80、适配器模式和代理模式之前有什么不同&#xff1f; 81、什么是模板方法模式&#xff1f; 82、什么时候使用访问者模式&#xff1f; 83、什么时候使用组合模式&#xff1f; 84、继承和组合之间有什么不同&#…