[
https://issues.apache.org/jira/browse/THRIFT-3773?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15358479#comment-15358479
]
Chris Simpson commented on THRIFT-3773:
---------------------------------------
I've started working on this and have made a fair amount of progress so far so
I'll post for others to comment on and give input,
https://github.com/apocolipse/thrift
A couple of notes per the design goals:
- This will not be compatible with the Cocoa-Swift compiler, a new Swift
compiler is being rewritten, and being written towards Swift 3.0 API Design
guidelines.
- Run on Linux was the first goal
- Pure Swift library clean of any Objective-C or even Cocoa paradigms
- Only dependent on Foundation (The Swift variant coming with Swift 3.0)
- Interface will mostly be the same, but will notably be "Swift First" in
design, so the library likely wont be directly compatible with Cocoa generated
code and vise versa.
- Objective-C library out of scope for this
- Swift packaging has been considered but may also be out of scope, SPM is
still in its infancy and not very flexible yet, and other alternatives are "3rd
party" enough to ignore.
I've mostly finished the Library so far, but its still a WIP. I'm working
through the code generator.
A couple of notes on what I changed and why it wont be so compatible with the
Cocoa generator/library
- Completely redone error model. Errors are all very "Swifty", still giving
appropriate underlying error codes and messages but with an interface for
throwing and reading done in a clean manner (Throwing most errors is just 1
line of code!)
- Abstracting much of the generated code to the library via protocol
extensions. It struck me as odd that TStruct.write() was being repeatedly
generated for every type of struct, when it could be abstracted at the protocol
level with reflection. Similarly TEnum's are all RawRepresentable Int32 Enum's
that can also be similarly abstracted in the library. Replacing all generated
TStruct.write() generation is a single lookup dictionary for field ID's
generated for each struct (Which also doubles as a quick reference to field
ID's for dev's looking at the generated code)
- Default Values! Default values weren't handled at all in the Cocoa (Obj-C Or
Swift) library/generators. Additionally, non-optional properties on struct's
were initialized with an empty version of their type! Not only confusing (What
is the value of `let num = Int32()` ?) but requires that all TSerializable
structs and enums have init()'s as well, making for a headache when asking
"whats the default value then?". Removing `init()` requirements, and properly
implementing non-optional values, as well as including default values for both
struct members and service methods is a primary goal here (still havent nailed
out how to handle service methods as protocol declarations can't have default
values in Swift, however it can be implemented in the generated Clients, or as
a protocol extension, and/or as a default value for the args_struct's member)
- Value Typed transports and Swift 3.0 API design. Foundation in Swift 3.0
gives us a value typed Data, so all the transports have been rewritten to take
advantage of Data as a value type. This results in cleaner code as less Unsafe
pointers are being thrown around everywhere. In addition, I've updated much of
the interfaces to be more conforming to the Swift 3.0 API Guidelines, this
means things like all TProtocol methods are named `func read() -> String`
rather than `func readString() -> String` (per API Guidelines, remove redundant
words!) This can be changed if the Thrift community feels TProtocol methods at
the least need to look the same everywhere, however I felt at the time this was
a good fit. Similar changes to TProcessor, TTransport, Factories, etc. were
made to streamline naming (no extra words, don't name fields as their type, and
so on)
Stretch goal (and somewhat implemented) - Documentation! Thrift supports
docstrings in IDL files for everything, transposing them to Swift would be a
great tool when using with Xcode, option+click to look up docstrings!
Again, all a WIP and would love some feedback and input, The library is 95%
complete (compiles fine, crude tests were successful) and the code generator is
about 50% complete (generated code somewhat compiles)
> Swift Library
> -------------
>
> Key: THRIFT-3773
> URL: https://issues.apache.org/jira/browse/THRIFT-3773
> Project: Thrift
> Issue Type: New Feature
> Components: Swift - Library
> Reporter: Thomas Bartelmess
>
> We already have the option to generate Swift code in the Cocoa compiler,
> however large parts of the (Objective-C) Cocoa Library still depend on Cocoa
> and Objective-C.
> It would be good to have a native Swift library that doesn't depend on the
> Cocoa libraries.
> Design goals:
> - Fully compatible with the code that is currently generated by the Cocoa
> compiler (both Objective-C and Swift).
> - Ability to run on Linux
> - Pure Swift, no Objective-C code.
> - No dependencies on closed source apple libraries
> - Keep the same interface, so that the library is compatible with the code
> the current cocoa compiler generates
> - Better server support that the current Objective-C library.
> - Follow the new Swift packaging format to be compatible with the Swift
> Package manager
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)