Permalink
Browse files

Other: Added a custom getters/setters example for gRPC

  • Loading branch information...
dcodeIO committed Mar 1, 2017
1 parent 478ee51 commit 8eeffcbcd027c929e2a76accad588c61dfa2e37c
Showing with 46 additions and 0 deletions.
  1. +46 −0 examples/custom-get-set.js
@@ -0,0 +1,46 @@
// this example demonstrates a way to keep field casing (as defined within .proto files)
// while still having virtual getters and setters for the camel cased counterparts.
var protobuf = require("..");
var proto = "syntax=\"proto3\";\
message MyMessage {\
string some_field = 1;\
}";
var root = protobuf.parse(proto, { keepCase: true }).root;
function camelCase(str) {
return str.substring(0,1) + str.substring(1).replace(/_([a-z])(?=[a-z]|$)/g, function($0, $1) { return $1.toUpperCase(); });
}
// this function adds alternative getters and setters for the camel cased counterparts
// to the runtime message's prototype (i.e. without having to register a custom class):
function addVirtualCamelcaseFields(type) {
type.fieldsArray.forEach(function(field) {
var altName = camelCase(field.name);
if (altName !== field.name)
Object.defineProperty(type.ctor.prototype, altName, {
get: function() {
return this[field.name];
},
set: function(value) {
this[field.name] = value;
}
});
});
}
var MyMessage = root.lookup("MyMessage");
addVirtualCamelcaseFields(MyMessage);
var myMessage = MyMessage.create({
some_field /* or someField */: "hello world"
});
console.log(
"someField:", myMessage.someField,
"\nsome_field:", myMessage.some_field,
"\nJSON:", JSON.stringify(myMessage)
);

0 comments on commit 8eeffcb

Please sign in to comment.