@qrvey/formula-lang
Version:
QFormula support for qrvey projects
146 lines (145 loc) • 4.31 kB
TypeScript
import { ENGINES, AST_TYPES, RESPONSE_LEVEL, AST_PRIMITIVES, CUSTOM_PRIMITIVE, Primitive } from '.';
import { BaseError } from '../errors';
interface FunctionElementDefinition {
identifier: string;
}
export interface FunctionDefinition extends FunctionElementDefinition {
recursiveStartIn?: number;
transpiler: EnginesFunction;
parameters?: Array<FunctionParameter>;
primitiveResult: Primitive | ((args: CommonAST[]) => Primitive);
}
export type EnginesFunction = {
[key in ENGINES]: Function;
};
export interface FunctionParameter extends FunctionElementDefinition {
optional: boolean;
generic?: boolean;
expectedPrimitive?: AST_PRIMITIVES;
validator: Array<ValidatorFunctionParameter>;
}
export interface ProcessNodeResult {
value: any;
type: AST_TYPES;
dataType: Primitive;
node: CommonAST;
}
export interface ValidatorParameterContext {
fnNode: FunctionCallAST;
argument: ProcessNodeResult;
}
export interface ValidatorFunctionParameter {
(value: any, dataType: Primitive | undefined, context: ValidatorParameterContext): ValidatorResponse;
}
export interface ValidatorResponse {
valid: boolean;
code?: string;
source?: RESPONSE_LEVEL;
message?: string;
info?: any;
mismatchData?: ValidatorExpectedInfo;
}
export interface ValidatorParameterResponse extends ValidatorResponse {
parameter: FunctionParameter;
argumentIndex: number;
}
export interface ValidatorExpectedInfo {
primitive: Primitive;
customPrimitive?: CUSTOM_PRIMITIVE;
customReceived?: CUSTOM_PRIMITIVE;
type?: AST_TYPES;
}
export interface TranspilationResponse {
valid: boolean;
expression?: string;
errors?: BaseError[];
details?: TranspilationDetails;
}
interface TranspilationDetails {
script: string | undefined;
customFunctions: string | undefined;
}
export interface FunctionList {
[identifier: string]: FunctionDefinition;
}
export interface ProgramPosition {
from: number;
to: number;
}
export interface CommonAST extends ProgramPosition {
type: AST_TYPES;
primitive: Primitive;
}
export interface ProgramAST extends CommonAST {
exp: string;
lang: string;
version: string;
body?: CommonAST;
errors?: BaseError[];
variables?: VariableContextDefinition[];
formulaFunctions?: CommonAST[];
flatBody?: CommonAST[];
}
export interface UnaryExpressionAST extends CommonAST {
operator: string;
operatorNode?: ProgramPosition;
validOperators: string[];
right: CommonAST;
}
export interface BinaryExpressionAST extends UnaryExpressionAST {
left: CommonAST;
}
export interface FunctionCallAST extends CommonAST {
name: string;
arguments: Array<CommonAST>;
parenthesisStart: boolean;
parenthesisEnd: boolean;
functionText: string;
functionIdentifier: ProgramPosition;
}
export type ValueASTType = string | boolean | number | CommonAST[] | null | Date;
export interface CommonValueAST extends CommonAST {
value: ValueASTType;
}
export interface UnknownAST extends CommonAST {
text: string;
}
export interface VariableAST extends CommonValueAST {
context?: VariableContextDefinition;
}
export interface ExternalFormulaAST extends VariableAST {
isExternalFormula: boolean;
}
export interface LiteralAST extends CommonValueAST {
dataType: AST_PRIMITIVES;
}
export interface VariableContextDefinition {
label: string;
id: string;
replacement?: string;
type: AST_PRIMITIVES;
extras?: Record<string, any>;
isExternalFormula?: boolean;
}
export interface FormulaContext {
model?: VariableContextDefinition[];
currentFormulaId?: string;
timezone?: TimezoneDefinition;
useSampleData?: boolean;
sampleData?: any;
}
export interface FormulaInference {
errorList: BaseError[];
formulaVariables: VariableContextDefinition[];
formulaFunctions: CommonAST[];
flatBody: CommonAST[];
}
interface TimezoneDefinition {
offset: string;
}
export type VariableASTType = AST_TYPES.variable | AST_TYPES.column | AST_TYPES.token | AST_TYPES.externalFormula;
export type DateUnit = 'Y' | 'M' | 'D';
export type DateDifUnitParam = DateUnit;
export type DateTimeUnit = DateUnit | 'H' | 'MI' | 'S';
export type DayOfWeekFormat = 'Day' | 'D';
export {};