fhir.js
Version:
FHIR javascript client
60 lines (52 loc) • 2.04 kB
JavaScript
(function() {
var utils = require("../utils");
var core = require("./core");
var id = function(x){return x;};
var constantly = function(x){return function(){return x;};};
var get_in = function(obj, path){
return path.split('.').reduce(function(acc,x){
if(x === 'versionId' && acc[x]){ return '_history/'+ acc[x] }
if(acc == null || acc == undefined) { return null; }
return acc[x];
}, obj);
};
var evalPropsExpr = function(exp, args){
var exps = exp.split('||').map(function(x){return x.trim().substring(1);});
for(var i = 0; i < exps.length; i++){
var res = get_in(args, exps[i]);
if(res){ return res; }
}
return null;
};
var evalExpr = function(exp, args){
if (exp.indexOf(":") == 0){
return evalPropsExpr(exp, args);
} else {
return exp;
}
};
var buildPathPart = function(pth, args){
var k = evalExpr(pth.trim(), args);
if((k==null || k === undefined) && pth.includes('target.versionId') == false){ throw new Error("Parameter "+pth+" is required: " + JSON.stringify(args)); }
return k;
};
// path chaining function
// which return haldler wrapper: (h, cfg)->(args -> promise)
// it's chainable Path("baseUrl").slash(":type").slash(":id").slash("_history")(id, {})({id: 5, type: 'Patient'})
// and composable p0 = Path("baseUrl); p1 = p0.slash("path)
var Path = function(tkn, chain){
//Chainable
var new_chain = function(args){
if(chain && tkn.includes('target.versionId') && !args.target.versionId){
return chain(args);
}
return ((chain && (chain(args) + "/")) || "") + buildPathPart(tkn, args);
};
var ch = core.Attribute('url', new_chain);
ch.slash = function(tkn){
return Path(tkn, new_chain);
};
return ch;
};
exports.Path = Path;
}).call(this);