6941bccde4
Protobuf 3.15 introduced support for marking scalar fields like uint32 as optional, and all of our tooling appears to support it now. This allows us to use simple optional/null checks in our Rust/ TypeScript code, without having to resort to an inner message. I had to apply a minor patch to protobufjs to get this working with the json-module output; this has also been submitted upstream: https://github.com/protobufjs/protobuf.js/pull/1693 I've modified CardStatsResponse as an example of the new syntax. One thing to note: while the Rust and TypeScript bindings use optional/ null fields, as that is the norm in those languages, Google's Python bindings are not very Pythonic. Referencing an optional field that is missing will yield the default value, and a separate HasField() call is required, eg: ``` >>> from anki.stats_pb2 import CardStatsResponse as R ... msg = R.FromString(b"") ... print(msg.first_review) ... print(msg.HasField("first_review")) 0 False ```
27 lines
1.1 KiB
Diff
27 lines
1.1 KiB
Diff
diff --git a/node_modules/protobufjs/src/field.js b/node_modules/protobufjs/src/field.js
|
|
index 20c1cd2..3a1395f 100644
|
|
--- a/node_modules/protobufjs/src/field.js
|
|
+++ b/node_modules/protobufjs/src/field.js
|
|
@@ -270,6 +270,8 @@ Field.prototype.resolve = function resolve() {
|
|
this.typeDefault = null;
|
|
else // instanceof Enum
|
|
this.typeDefault = this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]; // first defined
|
|
+ } else if (this.options && this.options.proto3_optional) {
|
|
+ this.typeDefault = null;
|
|
}
|
|
|
|
// use explicitly set default value if present
|
|
diff --git a/node_modules/protobufjs/src/root.js b/node_modules/protobufjs/src/root.js
|
|
index df6f11f..112f9e8 100644
|
|
--- a/node_modules/protobufjs/src/root.js
|
|
+++ b/node_modules/protobufjs/src/root.js
|
|
@@ -259,7 +259,7 @@ Root.prototype.resolveAll = function resolveAll() {
|
|
};
|
|
|
|
// only uppercased (and thus conflict-free) children are exposed, see below
|
|
-var exposeRe = /^[A-Z]/;
|
|
+var exposeRe = /^[A-Za-z]/;
|
|
|
|
/**
|
|
* Handles a deferred declaring extension field by creating a sister field to represent it within its extended type.
|