-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement a javascript backend #30
Comments
Actually, the generated code above is styled after that we generate for statically typed backends. We could take advantage of dynamically typed helper functions, and generate much less, something like: //----------------------------------------------------------------------
// adl/primitives.js (hand written)
var String = {
validate : function(v) {return typeof(v) == "string";},
default : function() {return "";},
copy : function(v) {return v;},
equal : function(v1, v2) {return v1 == v2;}
};
var Int32 = {
validate : function(v) {return typeof(v) == "number";},
default : function() {return 0;},
copy : function(v) {return return v;},
equal : function(v1, v2) {return v1 == v2;}
};
function structValidate(fieldTypes) {
return function(v) {
for(var field in fieldTypes) {
if(!fieldTypes[field].validate(v[field])) {
return false;
}
}
return true;
};
}
function structDefault(fieldTypes) {
return function() {
var result = {};
for(var field in fieldTypes) {
result[field] = fieldTypes[field].default();
}
return result;
};
}
function structCopy(fieldTypes) {
return function(v) {
var result = {};
for(var field in fieldTypes) {
result[field] = fieldTypes[field].copy(v[field]);
}
return result;
};
}
function structEquals(fieldTypes) {
return function(v1,v2) {
for(var field in fieldTypes) {
if(!fieldTypes[field].equal(v1[field], v2[field])) {
return false;
}
}
return true;
};
}
//----------------------------------------------------------------------
// mymodel.js (machine generated)
var primitives = require('adl/primitives.js');
var User_fields = {
"name" : primitives.String,
"address" : primitives.String,
"age" : primitives.Int32
};
var User = {
validate : primitives.structValidate(User_fields),
default : primitives.structDefault(User_fields),
copy : primitives.structCopy(User_fields),
equals : primitives.structEquals(User_fields)
} |
Actually, generics will require functions, so probably best to use functions everywhere, ie this ADL:
would generate code like this: //----------------------------------------------------------------------
// mymodel.js (machine generated)
var primitives = require('adl/primitives.js');
function User_fields(T) {
return {
"name" : primitives.String,
"address" : primitives.String,
"age" : primitives.Int32,
"details" : T
};
};
function User(T) {
var fieldTypes = User_fields(T);
return {
validate : primitives.structValidate(fieldTypes),
default : primitives.structDefault(fieldTypes),
copy : primitives.structCopy(fieldTypes),
equals : primitives.structEquals(fieldTypes)
};
} and monomorphic types (ie those without type parameters) would be functions with no arguments. |
This has been done, although in a very different way. We generate a javascript translation of the ADL data model, which can be processed generically in javascript. |
Unlike other language backends it is envisaged that a javascript backend won't generate type definitions - rather it will generate records of auxiliary functions to assist with each ADL type. For example, given this ADL:
We might generate code like:
Of course, there are lots of complexities to be dealt with:
etc
The text was updated successfully, but these errors were encountered: