[ 
https://issues.apache.org/jira/browse/THRIFT-3773?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15439489#comment-15439489
 ] 

Chris Simpson edited comment on THRIFT-3773 at 8/26/16 6:13 PM:
----------------------------------------------------------------

I currently have everything I'm working on in a private repo unfortunately, 
I'll push updates to my public fork of Thrift soon.
Currently its changing quickly due to Swift 3.0 being finalized, there still 
isn't 1:1 parity on API's so I have some extensions filling in the gaps, as 
well as some things are still unimplemented (Like URLSession :/).
Good news is I've tested out Binary/Compact protocols on both OSX and Linux and 
they work great, THTTP/SessionTransport work great on OSX (again still 
unimplemented in linux :/ ), and TSocketTransport works on both platforms. I 
renamed the existing Cocoa TSocketTransport implementation that I converted to 
swift to TCFSocketTransport and created a separate TSocketTransport leveraging 
posix sockets since Input/OutputStreams are still not 100% complete in Linux 
(However once they're done we can get rid of the more raw CF stuff since 
InputStream will have getStreamsToHost()).
Also contemplated making a GCD based async socket but couldn't get it to work 
properly so temporarily shelved that idea.

One thing i'm having issue with is serialization from other languages.  I 
decided that Structs shouldn't have an empty init() case and that non-optional 
vars shouldn't be initialized with empty types (i.e. no var userID = Int32()), 
but that presents compatibility problems with other languages (python 
specifically) where empty structs can be created and written with NULL values 
for required fields that weren't set.  In reality this shouldn't be an issue as 
properly designed interfaces will ensure the server is populating any/all 
required fields, but I may throw in a strict option to default use empty 
initialization and not use it when strict is set (this creates a cleaner 
Swift-ier interface).

Other things I've not yet tested or implemented are server implementations, 
however thats what's on my plate now ;).  TSocketServer should work fine (it 
compiles and everything needed is implemented in Linux), and I've decided not 
to write an HTTPServer implementation since there's too much overhead to throw 
into the library and not an existing one within the standard library (and the 
goal is to not have any dependancies).  I may show an example of how to use a 
3rd party HTTPServer as a thrift HTTP Server however which would fulfill most 
needs for that, there are several competing Swift HTTP Server implementations 
already, and in the near future there are sure to be some even better 
performing ones now that GCD is available on Linux properly.

A few more thing I need to shore up and test are async clients, and default 
values for the code generator, as well as I'd like to try to do something for 
namespacing.  My current plan for namespacing is to have the generator dump 
generated source in subdirectories per-namespace such that they can be imported 
as separate modules into whatever project (whether it be SPM or Xcode based), 
any thoughts on this are very welcome as I havent given it much thought but 
it's something that's definitely needed (Already ran into a namespace collision 
with some IDL's we use at work where we have an `Error` struct... Apple renamed 
Swift's ErrorType to ErrorProtocol and finally Error, so in the generator I 
actually explicitly specify Swift.Error for any exception types to avoid local 
namespace collisions, but that presents a problem if its not modularized)


was (Author: apocolipse):
I currently have everything I'm working on in a private repo unfortunately, 
I'll push updates to my public fork of Thrift soon.
Currently its changing quickly due to Swift 3.0 being finalized, there still 
isn't 1:1 parity on API's so I have some extensions filling in the gaps, as 
well as some things are still unimplemented (Like URLSession :/).
Good news is I've tested out Binary/Compact protocols on both OSX and Linux and 
they work great, THTTP/SessionTransport work great on OSX (again still 
unimplemented in linux :/ ), and TSocketTransport works on both platforms. I 
renamed the existing Cocoa TSocketTransport implementation that I converted to 
swift to TCFSocketTransport and created a separate TSocketTransport leveraging 
posix sockets since Input/OutputStreams are still not 100% complete in Linux 
(However once they're done we can get rid of direct stuff since InputStream 
will have getStreamsToHost()).
Also contemplated making a GCD based async socket but couldn't get it to work 
properly so temporarily shelved that idea.

One thing i'm having issue with is serialization from other languages.  I 
decided that Structs shouldn't have an empty init() case and that non-optional 
vars shouldn't be initialized with empty types (i.e. no var userID = Int32()), 
but that presents compatibility problems with other languages (python 
specifically) where empty structs can be created and written with NULL values 
for required fields that weren't set.  In reality this shouldn't be an issue as 
properly designed interfaces will ensure the server is populating any/all 
required fields, but I may throw in a strict option to default use empty 
initialization and not use it when strict is set (this creates a cleaner 
Swift-ier interface).

Other things I've not yet tested or implemented are server implementations, 
however thats what's on my plate now ;).  TSocketServer should work fine (it 
compiles and everything needed is implemented in Linux), and I've decided not 
to write an HTTPServer implementation since there's too much overhead to throw 
into the library and not an existing one within the standard library (and the 
goal is to not have any dependancies).  I may show an example of how to use a 
3rd party HTTPServer as a thrift HTTP Server however which would fulfill most 
needs for that, there are several competing Swift HTTP Server implementations 
already, and in the near future there are sure to be some even better 
performing ones now that GCD is available on Linux properly.

A few more thing I need to shore up and test are async clients, and default 
values for the code generator, as well as I'd like to try to do something for 
namespacing.  My current plan for namespacing is to have the generator dump 
generated source in subdirectories per-namespace such that they can be imported 
as separate modules into whatever project (whether it be SPM or Xcode based), 
any thoughts on this are very welcome as I havent given it much thought but 
it's something that's definitely needed (Already ran into a namespace collision 
with some IDL's we use at work where we have an `Error` struct... Apple renamed 
Swift's ErrorType to ErrorProtocol and finally Error, so in the generator I 
actually explicitly specify Swift.Error for any exception types to avoid local 
namespace collisions, but that presents a problem if its not modularized)

> 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)

Reply via email to