diff --git a/src/func.js b/src/func.js index 9671a4e..9cb61ac 100644 --- a/src/func.js +++ b/src/func.js @@ -3,6 +3,7 @@ var fs = require("fs"); const core = require("@actions/core"); const MAX_ARGS = 50; +const namedArgPattern = /^(?[a-zA-Z0-9_]+)=(?[^\s]+)$/; const commandDefaults = Object.freeze({ permission: "write", @@ -155,7 +156,7 @@ async function addReaction(octokit, repo, commentId, reaction) { } } -function getSlashCommandPayload(commentWords) { +function getSlashCommandPayload(commentWords, namedArgs) { var payload = { command: commentWords[0], args: "" @@ -163,8 +164,22 @@ function getSlashCommandPayload(commentWords) { if (commentWords.length > 1) { const argWords = commentWords.slice(1, MAX_ARGS + 1); payload.args = argWords.join(" "); - for (var i = 0; i < argWords.length; i++) { - payload[`arg${i + 1}`] = argWords[i]; + // Parse named and unnamed args + var unnamedCount = 1; + var unnamedArgs = []; + for (var argWord of argWords) { + if (namedArgs && namedArgPattern.test(argWord)) { + const { groups: { name, value } } = namedArgPattern.exec(argWord); + payload[`${name}`] = value; + } else { + unnamedArgs.push(argWord) + payload[`arg${unnamedCount}`] = argWord; + unnamedCount += 1; + } + } + // Add a string of only the unnamed args + if (namedArgs && unnamedArgs.length > 0) { + payload["unnamed_args"] = unnamedArgs.join(" "); } } return payload; diff --git a/src/func.test.js b/src/func.test.js index 8f156de..eaf6e1f 100644 --- a/src/func.test.js +++ b/src/func.test.js @@ -164,3 +164,33 @@ test("slash command payload", async () => { }; expect(getSlashCommandPayload(commandWords)).toEqual(payload); }); + +test("slash command payload with named args", async () => { + commandWords = ["test", "branch=master", "arg1", "env=prod", "arg2"]; + namedArgs = true; + payload = { + command: "test", + args: "branch=master arg1 env=prod arg2", + unnamed_args: "arg1 arg2", + branch: "master", + env: "prod", + arg1: "arg1", + arg2: "arg2" + }; + expect(getSlashCommandPayload(commandWords, namedArgs)).toEqual(payload); +}); + +test("slash command payload with malformed named args", async () => { + commandWords = ["test", "branch=", "arg1", "e-nv=prod", "arg2"]; + namedArgs = true; + payload = { + command: "test", + args: "branch= arg1 e-nv=prod arg2", + unnamed_args: "branch= arg1 e-nv=prod arg2", + arg1: "branch=", + arg2: "arg1", + arg3: "e-nv=prod", + arg4: "arg2" + }; + expect(getSlashCommandPayload(commandWords, namedArgs)).toEqual(payload); +});