jungle-organic
Version:
The organic programming framework
63 lines (47 loc) • 2.05 kB
text/typescript
namespace Jungle {
export interface IOLinkSpec{
ports:IO.PortSpec[];
linkFunciton:(a,b)=>void;
links:string[]
}
export class LinkForm extends BaseForm{
parse(formObj:FormSpec):{iospec:IOLinkSpec, contextspec:ContextSpec} {
var ctxdeclare = formObj.x || "";
this.preparator = formObj.p || function(x){};
var links = formObj.link || [];
var linkf = formObj.lf || function(a, b){}
var ports = formObj.port || [];
var context = {};
var specialInHook;
var specialOutHook;
var portlabels:IO.PortSpec[] = [];
var labels = {};
var contextprops:PropertySpec[] = []
//create port intermediate representation
var linkPortRegex = /^(_?)([a-zA-Z](?:\w*[a-zA-Z])?)(_?)$/
for (let i = 0; i < ports.length; i++) {
let pmatch = ports[i].match(linkPortRegex);
if(pmatch){
let inp = pmatch[1], label = pmatch[2], out = pmatch[3];
if(inp){
portlabels.push({label:label, direction:IO.Orientation.INPUT})
}
if(out){
portlabels.push({label:label, direction:IO.Orientation.OUTPUT})
}
}
}
//Forbid the use of underscores
var linkPropRegex = /^[a-zA-Z](?:\w*[a-zA-Z])?$/;
for (var k in formObj){
if(GForm.RFormProps.indexOf(k) > -1) continue;
if(k.match(linkPropRegex)){
contextprops.push({key:k, type:CTXPropertyTypes.NORMAL, value:formObj[k]})
}else{
throw new Error("Invalid property for link context, use ports")
}
}
return {iospec:{ports:portlabels, links:links, linkFunciton:linkf}, contextspec:{properties:contextprops, declaration:ctxdeclare}}
}
}
}