Files
彭镜肇 010fdfee3c Pengjingzhao ospp v2 (#23309)
* 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>
2025-09-22 10:32:21 +08:00

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,
}
}