瀏覽代碼

feat(参数解析): 为参数装饰器添加默认值支持

在参数装饰器中添加了`defaultValue`字段,允许为可选参数指定默认值。同时,在解析命令参数时,如果参数未提供且为可选,则使用默认值填充。这提高了参数解析的灵活性和用户体验。
枫林 3 月之前
父節點
當前提交
7a6e7d6afc
共有 4 個文件被更改,包括 17 次插入4 次删除
  1. 1 0
      src/interface/plugin.ts
  2. 11 1
      src/lib/Plugins.ts
  3. 3 1
      src/lib/decorators.ts
  4. 2 2
      src/plugins/test.ts

+ 1 - 0
src/interface/plugin.ts

@@ -46,6 +46,7 @@ export interface ParamMetadata {
     name: string; // 参数名称
     type: ParamType; // 参数类型
     index: number; // 参数索引
+    defaultValue?: any; // 默认值
     optional: boolean; // 是否可选
 }
 // 参数类型枚举

+ 11 - 1
src/lib/Plugins.ts

@@ -668,10 +668,17 @@ async function parseCommandParams(message: string, context: PrivateFriendMessage
     const params: any[] = [];
     const param = paramMetadata.get(command.pluginId + "." + command.fnName);
     if (param) {
+        let defaultValuei = 0
+        param.forEach((paramData) => {
+            if (paramData.defaultValue) {
+                defaultValuei++    
+            }
+        })
         for (const paramData of param) {
             const { name, type, index, optional } = paramData;
             const msg = `正确格式为: ${CMD_PREFIX}${command.pluginId} ${command.cmd} ${param.map(p => p.optional ? `[${p.name}]` : `<${p.name}>`).join(' ')}`
-            if (paramArgs.length < param?.length) {
+            
+            if (paramArgs.length + defaultValuei < param?.length) {
                 throw new Error(`参数不足,${msg}`);
             }
             if (!optional && !paramArgs[index]) {
@@ -699,6 +706,9 @@ async function parseCommandParams(message: string, context: PrivateFriendMessage
                 default:
                     throw new Error(`未知参数类型: ${type},${msg}`);
             }
+            if (optional && paramArgs[index] === undefined) {
+                params[index] = paramData.defaultValue;
+            }
         }
     }
     // 添加 context 参数

+ 3 - 1
src/lib/decorators.ts

@@ -16,7 +16,8 @@ export const paramMetadata = new Map<string, ParamMetadata[]>();
 export const commandList: Plugin[] = [];
 
 // 修改参数装饰器
-export function param(name: string, type: ParamType = ParamType.String, optional: boolean = false): ParameterDecorator {
+//默认值
+export function param(name: string, type: ParamType = ParamType.String, defaultValue?:any, optional: boolean = false): ParameterDecorator {
 
     return function (target: any, propertyKey: string | symbol | undefined, parameterIndex: number): void {
         const actualPropertyKey = propertyKey!;
@@ -33,6 +34,7 @@ export function param(name: string, type: ParamType = ParamType.String, optional
             name,
             type,
             index: parameterIndex,
+            defaultValue,
             optional: optional
         };
 

+ 2 - 2
src/plugins/test.ts

@@ -9,7 +9,7 @@ import botlogger from '../lib/logger.js';
 import { ParamType } from '../interface/plugin.js';
 
 @plugins({
-    easycmd: true,//是否启用简易命令,启用将将命令注册为#<命令名称>,不启用将注册为#<插件名称> <命令名称>
+    easycmd: true,//是否启用简易命令,启用将将命令注册为<命令名称>,不启用将注册为#<插件名称> <命令名称>
     name: "测试插件", //插件名称,用于显示在菜单中
     version: "1.0.0", //插件版本号,用于显示在菜单中
     describe: "测试功能", //插件描述,用于显示在菜单中
@@ -39,7 +39,7 @@ export class test {
     @runcod(["param"], "参数实例")//命令装饰器,用于注册命令
     async param(
         @param("参数1", ParamType.String) param1: string,//参数装饰器,用于解析参数
-        @param("参数2", ParamType.Number) param2: number,//参数装饰器,用于解析参数
+        @param("参数2", ParamType.Number,999,true) param2: number,//参数装饰器,用于解析参数
     ): Promise<any> {
         if (!param1 || !param2) {
             return "请输入正确的参数格式: #test param <字符串> <数字>";//返回错误信息,用于显示在菜单中