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>
217 lines
3.7 KiB
Go
217 lines
3.7 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 "strings"
|
|
|
|
// A varname containing pct-encoded characters is not the same variable as
|
|
// a varname with those same characters decoded.
|
|
//
|
|
// -- https://tools.ietf.org/html/rfc6570#section-2.3
|
|
type Values map[string]Value
|
|
|
|
func (v Values) Set(name string, value Value) {
|
|
v[name] = value
|
|
}
|
|
|
|
func (v Values) Get(name string) Value {
|
|
if v == nil {
|
|
return Value{}
|
|
}
|
|
return v[name]
|
|
}
|
|
|
|
type ValueType uint8
|
|
|
|
const (
|
|
ValueTypeString = iota
|
|
ValueTypeList
|
|
ValueTypeKV
|
|
valueTypeLast
|
|
)
|
|
|
|
var valueTypeNames = []string{
|
|
"String",
|
|
"List",
|
|
"KV",
|
|
}
|
|
|
|
func (vt ValueType) String() string {
|
|
if vt < valueTypeLast {
|
|
return valueTypeNames[vt]
|
|
}
|
|
return ""
|
|
}
|
|
|
|
type Value struct {
|
|
T ValueType
|
|
V []string
|
|
}
|
|
|
|
func (v Value) String() string {
|
|
if v.Valid() && v.T == ValueTypeString {
|
|
return v.V[0]
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (v Value) List() []string {
|
|
if v.Valid() && v.T == ValueTypeList {
|
|
return v.V
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (v Value) KV() []string {
|
|
if v.Valid() && v.T == ValueTypeKV {
|
|
return v.V
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (v Value) Valid() bool {
|
|
switch v.T {
|
|
default:
|
|
return false
|
|
case ValueTypeString:
|
|
return len(v.V) > 0
|
|
case ValueTypeList:
|
|
return len(v.V) > 0
|
|
case ValueTypeKV:
|
|
return len(v.V) > 0 && len(v.V)%2 == 0
|
|
}
|
|
}
|
|
|
|
func (v Value) expand(w *strings.Builder, spec varspec, exp *expression) error {
|
|
switch v.T {
|
|
case ValueTypeString:
|
|
val := v.V[0]
|
|
var maxlen int
|
|
if max := len(val); spec.maxlen < 1 || spec.maxlen > max {
|
|
maxlen = max
|
|
} else {
|
|
maxlen = spec.maxlen
|
|
}
|
|
|
|
if exp.named {
|
|
w.WriteString(spec.name)
|
|
if val == "" {
|
|
w.WriteString(exp.ifemp)
|
|
return nil
|
|
}
|
|
w.WriteByte('=')
|
|
}
|
|
return exp.escape(w, val[:maxlen])
|
|
case ValueTypeList:
|
|
var sep string
|
|
if spec.explode {
|
|
sep = exp.sep
|
|
} else {
|
|
sep = ","
|
|
}
|
|
|
|
var pre string
|
|
var preifemp string
|
|
if spec.explode && exp.named {
|
|
pre = spec.name + "="
|
|
preifemp = spec.name + exp.ifemp
|
|
}
|
|
|
|
if !spec.explode && exp.named {
|
|
w.WriteString(spec.name)
|
|
w.WriteByte('=')
|
|
}
|
|
for i := range v.V {
|
|
val := v.V[i]
|
|
if i > 0 {
|
|
w.WriteString(sep)
|
|
}
|
|
if val == "" {
|
|
w.WriteString(preifemp)
|
|
continue
|
|
}
|
|
w.WriteString(pre)
|
|
|
|
if err := exp.escape(w, val); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
case ValueTypeKV:
|
|
var sep string
|
|
var kvsep string
|
|
if spec.explode {
|
|
sep = exp.sep
|
|
kvsep = "="
|
|
} else {
|
|
sep = ","
|
|
kvsep = ","
|
|
}
|
|
|
|
var ifemp string
|
|
var kescape escapeFunc
|
|
if spec.explode && exp.named {
|
|
ifemp = exp.ifemp
|
|
kescape = escapeLiteral
|
|
} else {
|
|
ifemp = ","
|
|
kescape = exp.escape
|
|
}
|
|
|
|
if !spec.explode && exp.named {
|
|
w.WriteString(spec.name)
|
|
w.WriteByte('=')
|
|
}
|
|
|
|
for i := 0; i < len(v.V); i += 2 {
|
|
if i > 0 {
|
|
w.WriteString(sep)
|
|
}
|
|
if err := kescape(w, v.V[i]); err != nil {
|
|
return err
|
|
}
|
|
if v.V[i+1] == "" {
|
|
w.WriteString(ifemp)
|
|
continue
|
|
}
|
|
w.WriteString(kvsep)
|
|
|
|
if err := exp.escape(w, v.V[i+1]); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// String returns Value that represents string.
|
|
func String(v string) Value {
|
|
return Value{
|
|
T: ValueTypeString,
|
|
V: []string{v},
|
|
}
|
|
}
|
|
|
|
// List returns Value that represents list.
|
|
func List(v ...string) Value {
|
|
return Value{
|
|
T: ValueTypeList,
|
|
V: v,
|
|
}
|
|
}
|
|
|
|
// KV returns Value that represents associative list.
|
|
// KV panics if len(kv) is not even.
|
|
func KV(kv ...string) Value {
|
|
if len(kv)%2 != 0 {
|
|
panic("uritemplate.go: count of the kv must be even number")
|
|
}
|
|
return Value{
|
|
T: ValueTypeKV,
|
|
V: kv,
|
|
}
|
|
}
|