Skip to content

Commit 4cb432a

Browse files
committed
Add process entrypoint
1 parent 896f707 commit 4cb432a

7 files changed

Lines changed: 280 additions & 0 deletions

File tree

entrypoint/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
*.iml
2+
node_modules/

entrypoint/mapper.ts

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import {SingleValidationInputData} from "./readSingle";
2+
import {
3+
DataType,
4+
Flow,
5+
FunctionDefinition,
6+
LiteralValue,
7+
NodeFunction,
8+
NodeParameter,
9+
NodeParameterValue, ParameterDefinition,
10+
} from "@code0-tech/sagittarius-graphql-types";
11+
import {
12+
DefinitionDataType,
13+
NodeFunction as TucanaNodeFunction,
14+
NodeParameter as TucanaNodeParameter, RuntimeFunctionDefinition, RuntimeParameterDefinition,
15+
ValidationFlow,
16+
} from "@code0-tech/tucana/shared";
17+
import {toAllowedValue} from "@code0-tech/tucana/helpers";
18+
19+
export type TriangulumFlowValidationInput = {
20+
flow?: Flow,
21+
functions?: FunctionDefinition[],
22+
dataTypes?: DataType[]
23+
}
24+
25+
export function mapToFlowValidation(data: SingleValidationInputData): TriangulumFlowValidationInput {
26+
return {
27+
flow: mapFlow(data.flow!),
28+
functions: data.functions.map(mapFunctionDefinition),
29+
dataTypes: data.dataTypes.map(mapDataType)
30+
}
31+
}
32+
33+
function gid(type: string, id: bigint | number) {
34+
return `gid://sagittarius/${type}/${Number(id)}`;
35+
}
36+
37+
function mapFlow(flow: ValidationFlow): Flow {
38+
return {
39+
__typename: "Flow",
40+
id: gid('Flow', flow.flowId) as Flow['id'],
41+
inputType: flow.inputType,
42+
returnType: flow.returnType,
43+
startingNodeId: gid('NodeFunction', flow.startingNodeId) as NodeFunction['id'],
44+
nodes: {
45+
nodes: flow.nodeFunctions.map(mapNodeFunction)
46+
}
47+
};
48+
}
49+
50+
function mapNodeFunction(nodeFunction: TucanaNodeFunction): NodeFunction {
51+
return {
52+
id: gid('NodeFunction', nodeFunction.databaseId) as NodeFunction['id'],
53+
functionDefinition: {
54+
identifier: nodeFunction.runtimeFunctionId
55+
},
56+
nextNodeId: nodeFunction.nextNodeId ? gid('NodeFunction', nodeFunction.nextNodeId) as NodeFunction['id'] : undefined,
57+
parameters: {
58+
nodes: nodeFunction.parameters.map(mapNodeParameter)
59+
}
60+
}
61+
}
62+
63+
function mapNodeParameter(nodeParameter: TucanaNodeParameter): NodeParameter {
64+
let value: NodeParameterValue = {}
65+
const nodeParameterValue = nodeParameter.value?.value
66+
67+
if (nodeParameterValue?.oneofKind === 'literalValue') {
68+
value = {
69+
__typename: 'LiteralValue',
70+
value: toAllowedValue(nodeParameterValue.literalValue)
71+
};
72+
} else if (nodeParameterValue?.oneofKind === 'referenceValue') {
73+
const target = nodeParameterValue.referenceValue.target;
74+
75+
value = {
76+
__typename: 'ReferenceValue',
77+
referencePath: nodeParameterValue.referenceValue.paths.map(p => ({
78+
__typename: 'ReferencePath',
79+
path: p.path,
80+
arrayIndex: Number(p.arrayIndex)
81+
}))
82+
}
83+
84+
if (target.oneofKind === 'nodeId') {
85+
value.nodeFunctionId = gid('NodeFunction', target.nodeId) as NodeFunction['id']
86+
} else if (target.oneofKind === 'inputType') {
87+
value.nodeFunctionId = gid('NodeFunction', target.inputType.nodeId) as NodeFunction['id']
88+
value.parameterIndex = Number(target.inputType.parameterIndex)
89+
value.inputIndex = Number(target.inputType.inputIndex)
90+
}
91+
} else if (nodeParameterValue?.oneofKind === 'nodeFunctionId') {
92+
value = {
93+
__typename: 'NodeFunctionIdWrapper',
94+
id: gid('NodeFunction', nodeParameterValue.nodeFunctionId) as NodeFunction['id']
95+
}
96+
}
97+
98+
return {
99+
id: gid('NodeParameter', nodeParameter.databaseId) as NodeParameter['id'],
100+
value
101+
}
102+
}
103+
104+
function mapFunctionDefinition(functionDefinition: RuntimeFunctionDefinition): FunctionDefinition {
105+
return {
106+
identifier: functionDefinition.runtimeName,
107+
signature: functionDefinition.signature,
108+
parameterDefinitions: {
109+
nodes: functionDefinition.runtimeParameterDefinitions.map(mapParameterDefinition)
110+
}
111+
}
112+
}
113+
114+
function mapParameterDefinition(parameterDefinition: RuntimeParameterDefinition): ParameterDefinition {
115+
return {
116+
identifier: parameterDefinition.runtimeName,
117+
}
118+
}
119+
120+
function mapDataType(dataType: DefinitionDataType): DataType {
121+
return {
122+
identifier: dataType.identifier,
123+
type: dataType.type,
124+
genericKeys: dataType.genericKeys
125+
};
126+
}

entrypoint/package-lock.json

Lines changed: 81 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

entrypoint/package.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "@code0-tech/triangulum-entrypoint",
3+
"version": "0.0.0",
4+
"private": true,
5+
"dependencies": {
6+
"@code0-tech/triangulum": "file:../",
7+
"@code0-tech/tucana": "0.0.62",
8+
"@protobuf-ts/runtime": "^2.11.1"
9+
},
10+
"devDependencies": {
11+
"bun-types": "^1.3.11"
12+
}
13+
}

entrypoint/readSingle.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {
2+
DefinitionDataType,
3+
RuntimeFunctionDefinition,
4+
ValidationFlow
5+
} from "@code0-tech/tucana/shared";
6+
7+
export type SingleValidationInputData = {
8+
flow?: ValidationFlow,
9+
functions: RuntimeFunctionDefinition[],
10+
dataTypes: DefinitionDataType[]
11+
};
12+
13+
export async function readSingleValidation(input: AsyncIterable<string>) {
14+
const data: SingleValidationInputData = {
15+
functions: [],
16+
dataTypes: []
17+
};
18+
19+
let parsingState = 0;
20+
21+
for await (const line of input) {
22+
if(line === '') {
23+
parsingState++;
24+
continue;
25+
}
26+
27+
const message = Uint8Array.fromBase64(line);
28+
if(parsingState === 0) {
29+
data.flow = ValidationFlow.fromBinary(message);
30+
} else if(parsingState === 1) {
31+
data.functions.push(RuntimeFunctionDefinition.fromBinary(message));
32+
} else if(parsingState === 2) {
33+
data.dataTypes.push(DefinitionDataType.fromBinary(message));
34+
}
35+
}
36+
37+
return data;
38+
}
39+

entrypoint/single-validation.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {readSingleValidation} from "./readSingle";
2+
import {mapToFlowValidation} from "./mapper";
3+
import {getFlowValidation} from "@code0-tech/triangulum";
4+
5+
const data = await readSingleValidation(console);
6+
const validationInput = mapToFlowValidation(data);
7+
8+
const result = getFlowValidation(validationInput.flow, validationInput.functions, validationInput.dataTypes)
9+
10+
console.info(JSON.stringify(result));

entrypoint/tsconfig.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"compilerOptions": {
3+
"strict": true,
4+
"moduleResolution": "bundler",
5+
"module": "esnext",
6+
"target": "esnext",
7+
"types": ["bun-types"]
8+
}
9+
}

0 commit comments

Comments
 (0)