mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/yunionio/cloudpods.git
synced 2026-09-20 08:03:53 +08:00
* feat(mcp-server): 增加mcclient sdk适配器结构体以及对应的认证方法 * feat(mcp-server): 增加资源查询的sdk适配器方法 * feat(mcp-server): 增加资源操作的sdk适配器方法 * feat(mcp-server): 增加区域资源查询工具 * feat(mcp-server): 增加网络资源查询工具 * feat(mcp-server): 增加镜像资源查询工具 * feat(mcp-server): 增加虚拟机资源查询工具 * feat(mcp-server): 增加vpc资源查询工具 * feat(mcp-server): 增加存储资源查询工具 * feat(mcp-server): 增加套餐资源查询工具 * feat(mcp-server): 增加虚拟机创建工具 * feat(mcp-server): 增加虚拟机监控工具 * feat(mcp-server): 增加虚拟机操作工具,包括启动、重启、停止、重置密码和删除 * optimize(mcp-server): 增加工具函数接口定义 * feat(mcp-server): 增加工具函数所使用的结构体模型 * feat(mcp-server): 新增工具统一注册中心 * feat(mcp-server): 增加mcp服务中心 * feat(mcp-server): 增加统一配置中心 * feat(mcp-server): 增加服务启动主入口 * doc(mcp-server): 增加mcp-server相关的说明,安装和使用文档 * fix(mcp-server): 更正文档位置以及补充图片 * refactor(mcp-server): 修正了service以及配置解析的逻辑 * refactor(mcp-server): 将日志打印相关代码改成使用log * feat(mcp-server): 增加mcclient sdk适配器结构体以及对应的认证方法 * feat(mcp-server): 增加资源查询的sdk适配器方法 * feat(mcp-server): 增加资源操作的sdk适配器方法 * feat(mcp-server): 增加区域资源查询工具 * feat(mcp-server): 增加网络资源查询工具 * feat(mcp-server): 增加镜像资源查询工具 * feat(mcp-server): 增加虚拟机资源查询工具 * feat(mcp-server): 增加vpc资源查询工具 * feat(mcp-server): 增加存储资源查询工具 * feat(mcp-server): 增加套餐资源查询工具 * feat(mcp-server): 增加虚拟机创建工具 * feat(mcp-server): 增加虚拟机监控工具 * feat(mcp-server): 增加虚拟机操作工具,包括启动、重启、停止、重置密码和删除 * optimize(mcp-server): 增加工具函数接口定义 * feat(mcp-server): 增加工具函数所使用的结构体模型 * feat(mcp-server): 新增工具统一注册中心 * feat(mcp-server): 增加mcp服务中心 * feat(mcp-server): 增加统一配置中心 * feat(mcp-server): 增加服务启动主入口 * doc(mcp-server): 增加mcp-server相关的说明,安装和使用文档 * fix(mcp-server): 更正文档位置以及补充图片 * refactor(mcp-server): 修正了service以及配置解析的逻辑 * refactor(mcp-server): 将日志打印相关代码改成使用log * fix(mcp-server): 修复依赖导入以及缺失等问题 * refactor(mcp-server): 复用common_options * fix: 修复配置结构体字段重复的问题 * doc(mcp-server): 更正文档错误 * style(mcp-server): 格式化import顺序 * style(mcp-server): 格式化import导入 * style(mcp-server): 规范import语句 * doc(mcp-server): 给目录生成doc文件 --------- Co-authored-by: 屈轩 <qu_xuan@icloud.com>
117 lines
2.3 KiB
Go
117 lines
2.3 KiB
Go
// Copyright (C) 2016 Kohei YOSHIDA. All rights reserved.
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of The BSD 3-Clause License
|
|
// that can be found in the LICENSE file.
|
|
|
|
package uritemplate
|
|
|
|
import (
|
|
"log"
|
|
"regexp"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
debug = debugT(false)
|
|
)
|
|
|
|
type debugT bool
|
|
|
|
func (t debugT) Printf(format string, v ...interface{}) {
|
|
if t {
|
|
log.Printf(format, v...)
|
|
}
|
|
}
|
|
|
|
// Template represents a URI Template.
|
|
type Template struct {
|
|
raw string
|
|
exprs []template
|
|
|
|
// protects the rest of fields
|
|
mu sync.Mutex
|
|
varnames []string
|
|
re *regexp.Regexp
|
|
prog *prog
|
|
}
|
|
|
|
// New parses and constructs a new Template instance based on the template.
|
|
// New returns an error if the template cannot be recognized.
|
|
func New(template string) (*Template, error) {
|
|
return (&parser{r: template}).parseURITemplate()
|
|
}
|
|
|
|
// MustNew panics if the template cannot be recognized.
|
|
func MustNew(template string) *Template {
|
|
ret, err := New(template)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
// Raw returns a raw URI template passed to New in string.
|
|
func (t *Template) Raw() string {
|
|
return t.raw
|
|
}
|
|
|
|
// Varnames returns variable names used in the template.
|
|
func (t *Template) Varnames() []string {
|
|
t.mu.Lock()
|
|
defer t.mu.Unlock()
|
|
if t.varnames != nil {
|
|
return t.varnames
|
|
}
|
|
|
|
reg := map[string]struct{}{}
|
|
t.varnames = []string{}
|
|
for i := range t.exprs {
|
|
expr, ok := t.exprs[i].(*expression)
|
|
if !ok {
|
|
continue
|
|
}
|
|
for _, spec := range expr.vars {
|
|
if _, ok := reg[spec.name]; ok {
|
|
continue
|
|
}
|
|
reg[spec.name] = struct{}{}
|
|
t.varnames = append(t.varnames, spec.name)
|
|
}
|
|
}
|
|
|
|
return t.varnames
|
|
}
|
|
|
|
// Expand returns a URI reference corresponding to the template expanded using the passed variables.
|
|
func (t *Template) Expand(vars Values) (string, error) {
|
|
var w strings.Builder
|
|
for i := range t.exprs {
|
|
expr := t.exprs[i]
|
|
if err := expr.expand(&w, vars); err != nil {
|
|
return w.String(), err
|
|
}
|
|
}
|
|
return w.String(), nil
|
|
}
|
|
|
|
// Regexp converts the template to regexp and returns compiled *regexp.Regexp.
|
|
func (t *Template) Regexp() *regexp.Regexp {
|
|
t.mu.Lock()
|
|
defer t.mu.Unlock()
|
|
if t.re != nil {
|
|
return t.re
|
|
}
|
|
|
|
var b strings.Builder
|
|
b.WriteByte('^')
|
|
for _, expr := range t.exprs {
|
|
expr.regexp(&b)
|
|
}
|
|
b.WriteByte('$')
|
|
t.re = regexp.MustCompile(b.String())
|
|
|
|
return t.re
|
|
}
|