From 9d55b11e3f16cc57b1dd334f5ab5175ac0c06619 Mon Sep 17 00:00:00 2001 From: cpendery Date: Mon, 11 Sep 2023 11:26:35 -0400 Subject: [PATCH] fix: bad codegens & add makefile for convenience Signed-off-by: cpendery --- Makefile | 10 +++++++ autocomplete/extract/extract.ts | 46 ++++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 15 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a07d52a --- /dev/null +++ b/Makefile @@ -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/ \ No newline at end of file diff --git a/autocomplete/extract/extract.ts b/autocomplete/extract/extract.ts index 343c02c..6ddecc8 100644 --- a/autocomplete/extract/extract.ts +++ b/autocomplete/extract/extract.ts @@ -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(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 | 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): 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)}