@@ -12,46 +12,25 @@ import Foundation
12
12
13
13
struct PlaygroundError {
14
14
let message : String
15
- let code : Int
16
-
17
- init ? ( json: [ String : AnyObject ] ) {
18
- if let message = json [ " message " ] as? String ,
19
- let code = json [ " code " ] as? Int {
20
- self . message = message
21
- self . code = code
22
- } else {
23
- return nil
24
- }
25
- }
15
+ let code : Int32
26
16
}
27
17
28
18
extension PlaygroundError : Error { }
29
19
30
20
func listToolchains( ) -> Result < [ Toolchain ] , PlaygroundError > {
31
- let response = JsonResponse . from ( externFn: playgroundGetToolchains)
32
- switch response {
33
- case . ok( let result) :
34
- let data = ( result as! [ AnyObject ] )
35
- let toolchains = data. map { Toolchain . fromJson ( json: $0) ! }
36
- return . success( toolchains)
37
- case . error( let error) :
38
- return . failure( error)
39
- }
21
+ let response = PlaygroundResult . from { err in playgroundGetToolchains ( err) }
22
+ return response. map ( { ( toolchains) -> [ Toolchain ] in
23
+ let data = toolchains as! [ AnyObject ]
24
+ return data. map { Toolchain . fromJson ( json: $0) ! }
25
+ } )
40
26
}
41
27
42
28
func executeTask( inDirectory buildDir: URL , task: CompilerTask , stderr: @escaping ( ( String ) -> ( ) ) ) -> Result < CompilerResult , PlaygroundError > {
43
29
GlobalTaskContext . stderrCallback = stderr
44
30
let buildPath = buildDir. path
45
31
let taskJson = task. toJson ( )
46
- let response = JsonResponse . from { playgroundExecuteTask ( buildPath, taskJson, stderrCallback) }
47
-
48
- switch response {
49
- case . ok( let result) :
50
- let data = result as! [ String : AnyObject ]
51
- return . success( CompilerResult . fromJson ( data) )
52
- case . error( let err) :
53
- return . failure( err)
54
- }
32
+ let response = PlaygroundResult . from { err in playgroundExecuteTask ( buildPath, taskJson, stderrCallback, err) }
33
+ return response. map { CompilerResult . fromJson ( $0 as! [ String : AnyObject ] ) }
55
34
}
56
35
57
36
/// The least bad way I could think of to pipe callbacks from rust back
@@ -96,30 +75,26 @@ struct Toolchain {
96
75
return base
97
76
}
98
77
}
99
- // TODO: this can probably just be a Result<T, E>
100
- enum JsonResponse {
101
- case error( PlaygroundError )
102
- case ok( Any )
103
-
104
- /// Wrapper around an external function that returns json. Handles basic
105
- /// parsing and freeing memory.
106
- ///
107
- /// we control all the messages we send and receive, so we assume all
108
- /// messages are well-formed.
109
- static func from( externFn: ( ) -> UnsafePointer < Int8 > ? ) -> JsonResponse {
110
- let cString = externFn ( ) !
78
+
79
+ typealias PlaygroundResult = Result < Any , PlaygroundError >
80
+
81
+ extension PlaygroundResult {
82
+ /// Call an external function, doing error handling and json parsing.
83
+ static func from( externFn: ( UnsafeMutablePointer < ExternError > ) -> UnsafePointer < Int8 > ? ) -> PlaygroundResult {
84
+ var error = ExternError ( )
85
+ let cString = externFn ( & error) !
111
86
defer { playgroundStringFree ( cString) }
112
87
113
- let string = String ( cString: cString, encoding: . utf8) !
114
- let message = try ! JSONSerialization . jsonObject ( with: string. data ( using: . utf8) !) as! [ String : AnyObject ]
115
- if let result = message [ " result " ] {
116
- return . ok( result)
117
- } else if let error = message [ " error " ] {
118
- let error = error as! [ String : AnyObject ]
119
- return . error( PlaygroundError ( json: error) !)
120
- } else {
121
- fatalError ( " invalid json response: \( message) " )
88
+ if error. code != 0 {
89
+ let message = String ( cString: error. message, encoding: . utf8) !
90
+ let error = PlaygroundError ( message: message, code: error. code)
91
+ playgroundStringFree ( error. message)
92
+ return . failure( error)
122
93
}
94
+
95
+ let string = String ( cString: cString, encoding: . utf8) !
96
+ let message = try ! JSONSerialization . jsonObject ( with: string. data ( using: . utf8) !)
97
+ return . success( message)
123
98
}
124
- }
125
99
100
+ }
0 commit comments