Comments (7)
Wrappers could easily be implemented as a generated base + extensions for the custom JSON behaviors. Someone recently asked me about "easy starter projects" -- I think that would be one.
I suspect Struct and even Any could also be done that way, though Any might require some adjustments to the rest of the library to expose the right customization points.
from swift-protobuf.
The NullValue
enum in struct.proto
is going to make this a little trickier. Since it's an enum and the json
property is generated directly on the type, there's no way to have an extension replace it. (Aside: Even if we extract JSON support into separate extensions, we can't introduce our own hand-written extension on the same type without it causing an ambiguity.)
I haven't thought too deeply about how to solve this yet, but the options that come to mind feel like hacks:
- Add a method to
ProtoEnum
likeremapJSONName(_ value: Self, _ name: String)
and have the generated code call it, passing it the JSON string for the case. The default implementation in the protocol extension would just return the string verbatim. A hand-written extension on concrete enum types could then override it and return something else (in this case,"null"
). - Just add a special case for
Google_Protobuf_NullValue
in the JSON serialization code. - Other options...?
Any option will pick will likely have a small cost in terms of runtime library size, generated code size, and execution speed. Hopefully they're negligible; in terms of execution speed at least, surely the rest of the string processing will dominate whatever we add.
from swift-protobuf.
Since it's an enum and the json property is generated directly on the type, there's no way to have an extension replace it.
The technique I used to allow overriding generated methods on messages could work here. In the library, define:
extension ProtobufEnum {
var json: String {return _protoc_generated_json}
}
The generator then emits a definition for _protoc_generated_json
instead of defining json
directly. Then we can override json
in an extension (struct/enum extensions can override protocol extensions).
from swift-protobuf.
@allevato is working on this for Struct. Once that lands, I've got an idea for how we might be able to do this for Any.
from swift-protobuf.
#387 removed the Any version. This is now done.
from swift-protobuf.
🎉 🎉 🎉
from swift-protobuf.
Good work!
from swift-protobuf.
Related Issues (20)
- 2 .proto has the same message names, which is why the project is not going to be built HOT 1
- Package Resolution Failed in Xcode 15.3 HOT 1
- Can I use SwiftProtobufPluginLibrary or SwiftProtobuf as a Protobuf-parser in Swift project? HOT 1
- The "thread" sanitizer testing is failing HOT 8
- The fuzz regression tests seem to have stopped working. HOT 2
- Need to Add a Privacy Manifest for Apple Validation store for sprint 2024 HOT 1
- Add a PrivacyInfo file HOT 1
- TextFormat seems like it might not be to spec for "inf", "infinity", or "nan" HOT 2
- PR approved back in July 2022 and changes still not included in a release HOT 7
- Unable to verify code signature when installing app to iOS from XCode HOT 4
- Primitive one-of type always passes nil as its argument for decoder HOT 8
- Serialization is not generated HOT 8
- Support for Protobuf Editions HOT 2
- Un-revert breaking changes before releasing v2
- Consider support for newer concepts like `BitwiseCopyable` HOT 1
- SwiftProtobuf.xcodeproj cannot be opened because it is missing its project.pbxproj file. HOT 4
- New `CodeGenerator` protocol should allow customising the `Google_Protobuf_Compiler_CodeGeneratorRequest` HOT 7
- SwiftProtobufPluginLibrary.FileDescriptor.proto is deprecated HOT 13
- xCode shell script doesn't run HOT 6
- Breaking change in `1.27.0` HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from swift-protobuf.