UNPKG

flora-exception

Version:

An exception system for FQL.

160 lines (157 loc) 4.48 kB
import { query, Select } from "faunadb"; import { FloraException, IsException } from "./Exception"; import { Raise } from "./Raise"; import { generate } from "shortid"; import { generateSlug } from "random-word-slugs"; const { Concat, Map, If, Var, Lambda, Format, ToString, Let } = query; export const FloraLocalState = { performance: false }; export const togglePerformance = (b) => { FloraLocalState.performance = b; }; const result = "result"; const arg = "arg"; const xarg = "xarg"; /** * Extracts an arg from a TypePredicate tuple. * @param arg * @param loc * @returns */ export const ExtractArg = (arg, loc) => { const predicateName = arg[1] ? arg[1].name || "$Unspecified" : "$Unspecified"; const Predicate = arg[1] ? arg[1] : () => true; let arg0 = ""; try { arg0 = `${arg[0].toString().slice(0, 20)}...`; } catch { arg0 = "[failedToString]"; } return Let({ [xarg]: arg[0], [result]: If(Predicate(Var(xarg)), Var(xarg), Raise(FloraException({ name: "TypeException", msg: Concat([ `Argument does not match type ${predicateName}: Value {`, Format('%@', Var(xarg)), `} is not of type ${predicateName}` ]), location: loc }))) }, Var(result)); }; /** * Extracts args for a n array of TypePredicate tuples. * @param args * @param loc * @returns */ export const ExtractArgs = (args, loc) => { return Map(args, Lambda(arg, ExtractArg(Var(arg), loc))); }; /** * Extracts args from an array of type predicate Tuples on the client. * @param args * @param loc * @returns */ export const extractArgs = (args, loc) => { return args.map((arg) => { return ExtractArg(arg, loc); }); }; export const stableExtractArgs = (args) => { return args.map((arg) => { return arg[0]; }); }; export const getInstance = () => { return `${generateSlug(1, { format: "title", partsOfSpeech: ["adjective",], categories: { adjective: ["personality"] } })}${generateSlug(1, { format: "title", partsOfSpeech: ["noun",], categories: { noun: ["animals"] } })}/${generate()}`; }; export const getLocation = (errorStack) => { const caller = errorStack.split("\n")[2].trim().split(" ")[1]; const _location = `${getInstance()}/${errorStack.split("\n").length}`; const mainLoaction = `${caller} $(${_location}/MAIN)`; const yieldLocation = `${caller} $(${_location}/YIELD(`; return [mainLoaction, yieldLocation]; }; const xargs = "xargs"; export const _Fx = (resultQuery, location, $ReturnType, returnName) => { return Let({ [result]: resultQuery }, If($ReturnType(Var(result)), Var(result), If(IsException(Var(result)), Var(result), Raise(FloraException({ name: "ReturnTypeExcpetion", msg: Concat([ `Return does not match type ${returnName}: Value {`, Format('%@', Var(result)), `} is not of type ${returnName}` ]), location: Select(0, location) }))))); }; export const _FxFunctionName = "_Fx-Flora-Exception"; export const DeployFx = () => { }; export const Call_Fx = () => { }; /** * * @param args * @param $ReturnType * @param expr * @returns */ export const Fx = (args, $ReturnType, expr) => { return expr(...stableExtractArgs(args)); /*const errorStack = new Error().stack || ""; const location = getLocation(errorStack); const predicateName = $ReturnType ? $ReturnType.name||"$Unspecified" : "$Unspecified"; const resultQuery = FrontendYield({ name : Select(1, location) as unknown as string, args :extractArgs(args, Select(0, location) as unknown as string), expr : expr }); return _Fx( resultQuery, location, $ReturnType, predicateName, )*/ }; const reguardArgs = (args, argTypes) => { return args.map((arg, index) => { return [ arg, argTypes[index] ? argTypes[index] : () => true ]; }); }; /** * Factory for a Fx function. * @param args * @param $ReturnType * @param expr * @returns */ export const mFx = ($ArgTypes, $ReturnType, expr) => (...args) => { return expr(...args); /*return Fx( reguardArgs(args, $ArgTypes), $ReturnType, expr as (...args : any[])=>GuardedT<R> )*/ };