initial cli api, some movement on tool selection
This commit is contained in:
55
util/call.ts
Normal file
55
util/call.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
type transformer = (arg: string) => any;
|
||||
interface IConfig {
|
||||
multiTransform?: boolean;
|
||||
args?: string[];
|
||||
}
|
||||
|
||||
export async function call<T extends unknown[]>(
|
||||
tool: ToolFunc<T>,
|
||||
transforms: transformer[],
|
||||
conf?: IConfig,
|
||||
) {
|
||||
const config: IConfig = {};
|
||||
|
||||
if (typeof conf === "object") {
|
||||
Object.assign(config, conf);
|
||||
}
|
||||
|
||||
const args = config.args || Deno.args;
|
||||
const shouldPair = transforms.length === args.length;
|
||||
const multiTransform = config.multiTransform ||
|
||||
!shouldPair && transforms.length > 1;
|
||||
|
||||
const transformedArgs = args.map((arg, i) => {
|
||||
if (shouldPair) return transforms[i](arg);
|
||||
if (multiTransform) return transforms.reduce((a, b) => b(a), arg);
|
||||
return transforms[0] ? transforms[0](arg) : arg;
|
||||
});
|
||||
|
||||
await tool(...transformedArgs as T);
|
||||
}
|
||||
|
||||
type prompt = [string, (v?: string) => boolean] | string;
|
||||
|
||||
export async function callWithArgPrompt<T extends unknown[]>(
|
||||
tool: ToolFunc<T>,
|
||||
prompts: prompt[],
|
||||
args?: string[],
|
||||
) {
|
||||
function buildPromptTransform(p: prompt): transformer {
|
||||
let validation = (v?: string) => !!v;
|
||||
let pText = p as string;
|
||||
|
||||
if (Array.isArray(p)) {
|
||||
[pText, validation] = p;
|
||||
}
|
||||
|
||||
return (a: string) => {
|
||||
while (!validation(a)) {
|
||||
a = prompt(pText) || "";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
await call(tool, prompts.map(buildPromptTransform), { args });
|
||||
}
|
Reference in New Issue
Block a user