UNPKG

@harmoniclabs/plu-ts-onchain

Version:

An embedded DSL for Cardano smart contracts creation coupled with a library for Cardano transactions, all in Typescript

126 lines (125 loc) 5.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.toDataSchemaAsData = exports.toDataSchema = void 0; var type_system_1 = require("../../type_system/index.js"); var tyArgs_1 = require("../../type_system/tyArgs/index.js"); function toDataSchema(t, title) { while ((0, type_system_1.isTaggedAsAlias)(t)) t = (0, type_system_1.unwrapAlias)(t); title = typeof title === "string" ? title : undefined; if (t[0] === type_system_1.PrimType.AsData && (0, type_system_1.typeExtends)(t[1], type_system_1.int)) return { title: title, dataType: "integer" }; if ((0, type_system_1.typeExtends)(t, type_system_1.int)) return { title: title, dataType: "#integer" }; if (t[0] === type_system_1.PrimType.AsData && (0, type_system_1.typeExtends)(t[1], type_system_1.bs)) return { title: title, dataType: "bytes" }; if ((0, type_system_1.typeExtends)(t, type_system_1.bs)) return { title: title, dataType: "#bytes" }; if (t[0] === type_system_1.PrimType.AsData && t[1][0] === type_system_1.PrimType.List && t[1][1][0] === type_system_1.PrimType.Pair) { var schema = { dataType: "map" }; var keysSchema = toDataSchemaAsData((0, tyArgs_1.getElemsT)(t)[1]); var valueSchema = toDataSchemaAsData((0, tyArgs_1.getElemsT)(t)[2]); if (keysSchema.dataType) { schema.keys = keysSchema; } if (valueSchema.dataType) { schema.values = valueSchema; } return schema; } if ((0, type_system_1.typeExtends)(t, (0, type_system_1.map)(type_system_1.data, type_system_1.data))) { throw new Error("unsupported #list( #pair( ... , ... ) ); only lists as data please; term type was: " + (0, type_system_1.termTypeToString)(t)); } if (t[0] === type_system_1.PrimType.AsData && t[1][0] === type_system_1.PrimType.List) { var schema = { title: title, dataType: "list" }; var itemsSchema = toDataSchemaAsData((0, tyArgs_1.getElemsT)(t)); if (itemsSchema.dataType) { schema.items = itemsSchema; } return schema; } if ((0, type_system_1.typeExtends)(t, (0, type_system_1.list)(type_system_1.data))) { var schema = { title: title, dataType: "#list" }; var itemsSchema = toDataSchemaAsData((0, tyArgs_1.getElemsT)(t)); if (itemsSchema.dataType) { schema.items = itemsSchema; } return schema; } if (t[0] === type_system_1.PrimType.Struct || (t[0] === type_system_1.PrimType.AsData && t[1][0] === type_system_1.PrimType.Struct)) { return toDataSchemaAsData(t, title); } throw new Error("can't represent type as DataSchema; term type was: " + (0, type_system_1.termTypeToString)(t)); } exports.toDataSchema = toDataSchema; function toDataSchemaAsData(t, title) { while ((0, type_system_1.isTaggedAsAlias)(t) || t[0] === type_system_1.PrimType.AsData) t = (0, type_system_1.unwrapAlias)((0, tyArgs_1.unwrapAsData)(t)); title = typeof title === "string" ? title : undefined; if ((0, type_system_1.typeExtends)(t, type_system_1.int)) return { dataType: "integer", title: title }; if ((0, type_system_1.typeExtends)(t, type_system_1.bs)) return { dataType: "bytes", title: title }; if ((0, type_system_1.typeExtends)(t, (0, type_system_1.map)((0, type_system_1.tyVar)(), (0, type_system_1.tyVar)()))) { var schema = { dataType: "map", title: title }; var keysSchema = toDataSchemaAsData((0, tyArgs_1.getElemsT)(t)[1]); var valueSchema = toDataSchemaAsData((0, tyArgs_1.getElemsT)(t)[2]); if (keysSchema.dataType) { schema.keys = keysSchema; } if (valueSchema.dataType) { schema.values = valueSchema; } return schema; } if ((0, type_system_1.typeExtends)(t, (0, type_system_1.list)((0, type_system_1.tyVar)()))) { var schema = { dataType: "list", title: title }; var itemsSchema = toDataSchemaAsData((0, tyArgs_1.getElemsT)(t)); if (itemsSchema.dataType) { schema.items = itemsSchema; } return schema; } if (t[0] === type_system_1.PrimType.Struct) { var def = t[1]; var ctors = Object.keys(def); if (ctors.length === 1) { var ctor = ctors[0]; var ctorDef_1 = def[ctor]; var fieldNames = Object.keys(def[ctor]); return { dataType: "constructor", title: ctor.toString(), index: 0, fields: fieldNames.map(function (field) { return toDataSchemaAsData(ctorDef_1[field], field); }) }; } var len = ctors.length; var alternatives = new Array(len); var _loop_1 = function (i) { var ctor = ctors[i]; var ctorDef = def[ctor]; var fieldNames = Object.keys(def[ctor]); alternatives[i] = { dataType: "constructor", title: ctor.toString(), index: i, fields: fieldNames.map(function (field) { return toDataSchemaAsData(ctorDef[field], field); }) }; }; for (var i = 0; i < len; i++) { _loop_1(i); } return { title: title, anyOf: alternatives }; } return { title: title }; // opaque data } exports.toDataSchemaAsData = toDataSchemaAsData;