fix: bad codegens & add makefile for convenience

Signed-off-by: cpendery <cpendery@vt.edu>
This commit is contained in:
cpendery
2023-09-11 11:26:35 -04:00
parent e3dfa9e7fa
commit 9d55b11e3f
2 changed files with 41 additions and 15 deletions
+10
View File
@@ -0,0 +1,10 @@
.PHONY: codegen
codegen:
cd autocomplete/extract && npm test
.PHONY: clean
clean:
cp autocomplete/specs/specs_.go autocomplete/
rm -r autocomplete/specs
mkdir autocomplete/specs
mv autocomplete/specs_.go autocomplete/specs/
+31 -15
View File
@@ -6,11 +6,18 @@ import * as child_process from "child_process";
import ProgressBar = require("progress");
const exclusions = new Set(["deno.ts", "rush.ts"]);
const renamings = {
"-": "underscore",
};
const clearAllNewlines = (input: string): string => {
return input.replaceAll(/[\r\n]+/g, "");
};
const escapeSpecialCharacters = (input: string): string => {
return input.replaceAll("`", '"').replaceAll("\0", "\\\\0");
};
function chunk<T>(arr: T[], chuckSize: number): T[][] {
const arrays: T[][] = [];
for (let i = 0; i < arr.length; i += chuckSize)
@@ -63,18 +70,18 @@ const main = async () => {
}
const filenameWithoutExtension = path.parse(directoryItem.name).name;
const golangFilename =
renamings[filenameWithoutExtension] != null
? renamings[filenameWithoutExtension]
: filenameWithoutExtension;
const subcommand = spec as unknown as Fig.Subcommand;
const generatedCode = generateGolang(
subcommand,
filenameWithoutExtension
);
await fsAsync.writeFile(
path.join(
process.cwd(),
"..",
"specs",
`${filenameWithoutExtension}.go`
),
path.join(process.cwd(), "..", "specs", `${golangFilename}.go`),
generatedCode
);
progressBar.tick();
@@ -103,13 +110,16 @@ const generateTemplate = (template: Fig.Template): string => {
const genName = (name: Fig.SingleOrArray<string> | undefined): string => {
if (name == null) return "";
return Array.isArray(name)
? `Name: []string{${name.map((n) => `"${n}"`).join(",")}},`
? `Name: []string{${name
.filter((n) => n != null)
.map((n) => `"${n}"`)
.join(",")}},`
: `Name: "${name}",`;
};
const genDescription = (description: string | undefined): string => {
return description != null
? `Description: "${clearAllNewlines(description)}",`
? `Description: \`${escapeSpecialCharacters(description)}\`,`
: "";
};
@@ -137,19 +147,21 @@ const genSubcommands = (
if (subcommand == null) return "";
const subcommands = Array.isArray(subcommand) ? subcommand : [subcommand];
return `Subcommands: []model.Subcommand{${subcommands
.map((s) => generateSubcommand(s))
.map((s) => generateSubcommand(s, false))
.join(",")}},`;
};
const generateArgs = (args: Fig.SingleOrArray<Fig.Arg>): string => {
const argList = Array.isArray(args) ? args : [args];
const generatedArgs = argList.map((arg) => {
return `{
const generatedArgs = argList
.map((arg) => {
return `{
${genTemplates(arg.template)}
${genName(arg.name)}
${genDescription(arg.description)}
},`;
});
}`;
})
.join(",");
return `Args: []model.Arg{${generatedArgs}},`;
};
@@ -164,8 +176,12 @@ const generateOptions = (options: Fig.Option[]): string => {
return `Options: []model.Option{${generatedOptions}},`;
};
const generateSubcommand = (subcommand: Fig.Subcommand): string => {
return `model.Subcommand{
const generateSubcommand = (
subcommand: Fig.Subcommand,
usePrefix = true
): string => {
const prefix = usePrefix ? "model.Subcommand" : "";
return `${prefix}{
${genName(subcommand.name)}
${genDescription(subcommand.description)}
${genArgs(subcommand.args)}