diff --git a/packages/core/aqua-to-js/src/generate/validators.ts b/packages/core/aqua-to-js/src/generate/validators.ts deleted file mode 100644 index 5e917a98..00000000 --- a/packages/core/aqua-to-js/src/generate/validators.ts +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Copyright 2023 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - ArrowWithoutCallbacks, - FunctionCallDef, - JSONValue, - ScalarType, - SimpleTypes, - UnlabeledProductType, -} from "@fluencelabs/interfaces"; - -import { typeToTs } from "../common.js"; - -const numberTypes = [ - "u8", - "u16", - "u32", - "u64", - "i8", - "i16", - "i32", - "i64", - "f32", - "f64", -]; - -function isScalar(schema: ScalarType, arg: JSONValue) { - if (numberTypes.includes(schema.name)) { - return typeof arg === "number"; - } else if (schema.name === "bool") { - return typeof arg === "boolean"; - } else if (schema.name === "string") { - return typeof arg === "string"; - } else { - // Should not be possible - return false; - } -} - -export function validateFunctionCall( - schema: FunctionCallDef, - ...args: JSONValue[] -) { - const schemaArgs = - schema.arrow.domain.tag === "nil" - ? [] - : Object.values(schema.arrow.domain.fields); - - if (args.length !== schemaArgs.length) { - throw new Error( - `Expected ${schemaArgs.length} arguments but provided ${args.length}`, - ); - } - - for (let i = 0; i < args.length; i++) { - validateFunctionCallArg(schemaArgs[i], args[i], i + 1); - } -} - -export function validateFunctionCallArg( - schema: SimpleTypes | UnlabeledProductType | ArrowWithoutCallbacks, - arg: JSONValue, - argPosition: number, -) { - if (!isTypeMatchesSchema(schema, arg)) { - const expectedType = typeToTs(schema); - throw new Error( - `Argument ${argPosition} doesn't match schema. Expected type: ${expectedType}`, - ); - } -} - -export function isTypeMatchesSchema( - schema: SimpleTypes | UnlabeledProductType | ArrowWithoutCallbacks, - arg: JSONValue, -): boolean { - if (schema.tag === "nil") { - return arg === null; - } else if (schema.tag === "option") { - return arg === null || isTypeMatchesSchema(schema.type, arg); - } else if (schema.tag === "scalar") { - return isScalar(schema, arg); - } else if (schema.tag === "array") { - return ( - Array.isArray(arg) && - arg.every((item) => { - return isTypeMatchesSchema(schema.type, item); - }) - ); - } else if (schema.tag === "struct") { - return ( - !Array.isArray(arg) && - typeof arg === "object" && - arg !== null && - Object.entries(schema.fields).every(([field, type]) => { - return isTypeMatchesSchema(type, arg[field]); - }) - ); - } else if (schema.tag === "unlabeledProduct") { - return ( - Array.isArray(arg) && - arg.every((item, index) => { - return isTypeMatchesSchema(schema.items[index], item); - }) - ); - } else if (schema.tag === "arrow") { - return typeof arg === "function"; - } else { - return schema.tag === "topType"; - } -} diff --git a/packages/core/js-client/src/compilerSupport/conversions.ts b/packages/core/js-client/src/compilerSupport/conversions.ts index 5bcd71b8..9c82bc42 100644 --- a/packages/core/js-client/src/compilerSupport/conversions.ts +++ b/packages/core/js-client/src/compilerSupport/conversions.ts @@ -214,6 +214,12 @@ export const wrapFunction = ( ? schema.domain.items : Object.values(schema.domain.fields); + if (schemaArgs.length !== jsonArgs.length) { + throw new Error( + `Schema and generated air doesn't match. Air have been called with ${jsonArgs.length} args and schema contains ${schemaArgs.length} args`, + ); + } + const tsArgs = jsonArgs.map((arg, i) => { return aqua2ts(arg, schemaArgs[i]); });