Skip to content

Commit 899b263

Browse files
committed
Add feature to set named args in the payload
1 parent 335c3a1 commit 899b263

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

src/func.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var fs = require("fs");
33
const core = require("@actions/core");
44

55
const MAX_ARGS = 50;
6+
const namedArgPattern = /^(?<name>[a-zA-Z0-9_]+)=(?<value>[^\s]+)$/;
67

78
const commandDefaults = Object.freeze({
89
permission: "write",
@@ -155,16 +156,30 @@ async function addReaction(octokit, repo, commentId, reaction) {
155156
}
156157
}
157158

158-
function getSlashCommandPayload(commentWords) {
159+
function getSlashCommandPayload(commentWords, namedArgs) {
159160
var payload = {
160161
command: commentWords[0],
161162
args: ""
162163
};
163164
if (commentWords.length > 1) {
164165
const argWords = commentWords.slice(1, MAX_ARGS + 1);
165166
payload.args = argWords.join(" ");
166-
for (var i = 0; i < argWords.length; i++) {
167-
payload[`arg${i + 1}`] = argWords[i];
167+
// Parse named and unnamed args
168+
var unnamedCount = 1;
169+
var unnamedArgs = [];
170+
for (var argWord of argWords) {
171+
if (namedArgs && namedArgPattern.test(argWord)) {
172+
const { groups: { name, value } } = namedArgPattern.exec(argWord);
173+
payload[`${name}`] = value;
174+
} else {
175+
unnamedArgs.push(argWord)
176+
payload[`arg${unnamedCount}`] = argWord;
177+
unnamedCount += 1;
178+
}
179+
}
180+
// Add a string of only the unnamed args
181+
if (namedArgs && unnamedArgs.length > 0) {
182+
payload["unnamed_args"] = unnamedArgs.join(" ");
168183
}
169184
}
170185
return payload;

src/func.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,33 @@ test("slash command payload", async () => {
164164
};
165165
expect(getSlashCommandPayload(commandWords)).toEqual(payload);
166166
});
167+
168+
test("slash command payload with named args", async () => {
169+
commandWords = ["test", "branch=master", "arg1", "env=prod", "arg2"];
170+
namedArgs = true;
171+
payload = {
172+
command: "test",
173+
args: "branch=master arg1 env=prod arg2",
174+
unnamed_args: "arg1 arg2",
175+
branch: "master",
176+
env: "prod",
177+
arg1: "arg1",
178+
arg2: "arg2"
179+
};
180+
expect(getSlashCommandPayload(commandWords, namedArgs)).toEqual(payload);
181+
});
182+
183+
test("slash command payload with malformed named args", async () => {
184+
commandWords = ["test", "branch=", "arg1", "e-nv=prod", "arg2"];
185+
namedArgs = true;
186+
payload = {
187+
command: "test",
188+
args: "branch= arg1 e-nv=prod arg2",
189+
unnamed_args: "branch= arg1 e-nv=prod arg2",
190+
arg1: "branch=",
191+
arg2: "arg1",
192+
arg3: "e-nv=prod",
193+
arg4: "arg2"
194+
};
195+
expect(getSlashCommandPayload(commandWords, namedArgs)).toEqual(payload);
196+
});

0 commit comments

Comments
 (0)