@@ -6,15 +6,19 @@ import os
6
6
@MainActor
7
7
public protocol FileSyncDaemon : ObservableObject {
8
8
var state : DaemonState { get }
9
- func start( ) async throws ( DaemonError )
10
- func stop( ) async throws ( DaemonError )
9
+ func start( ) async
10
+ func stop( ) async
11
11
}
12
12
13
13
@MainActor
14
14
public class MutagenDaemon : FileSyncDaemon {
15
15
private let logger = Logger ( subsystem: Bundle . main. bundleIdentifier!, category: " mutagen " )
16
16
17
- @Published public var state : DaemonState = . stopped
17
+ @Published public var state : DaemonState = . stopped {
18
+ didSet {
19
+ logger. info ( " daemon state changed: \( self . state. description) " )
20
+ }
21
+ }
18
22
19
23
private var mutagenProcess : Process ?
20
24
private var mutagenPipe : Pipe ?
@@ -47,26 +51,24 @@ public class MutagenDaemon: FileSyncDaemon {
47
51
}
48
52
}
49
53
50
- public func start( ) async throws ( DaemonError ) {
54
+ public func start( ) async {
51
55
if case . unavailable = state { return }
52
56
53
57
// Stop an orphaned daemon, if there is one
54
58
try ? await connect ( )
55
- try ? await stop ( )
59
+ await stop ( )
56
60
57
61
( mutagenProcess, mutagenPipe) = createMutagenProcess ( )
58
62
do {
59
63
try mutagenProcess? . run ( )
60
64
} catch {
61
- state = . failed( " Failed to start file sync daemon: \( error) " )
62
- throw DaemonError . daemonStartFailure ( error)
65
+ state = . failed( DaemonError . daemonStartFailure ( error) )
63
66
}
64
67
65
68
do {
66
69
try await connect ( )
67
70
} catch {
68
- state = . failed( " failed to connect to file sync daemon: \( error) " )
69
- throw DaemonError . daemonStartFailure ( error)
71
+ state = . failed( DaemonError . daemonStartFailure ( error) )
70
72
}
71
73
72
74
state = . running
@@ -105,7 +107,7 @@ public class MutagenDaemon: FileSyncDaemon {
105
107
group = nil
106
108
}
107
109
108
- public func stop( ) async throws ( DaemonError ) {
110
+ public func stop( ) async {
109
111
if case . unavailable = state { return }
110
112
state = . stopped
111
113
guard FileManager . default. fileExists ( atPath: mutagenDaemonSocket. path) else {
@@ -155,7 +157,7 @@ public class MutagenDaemon: FileSyncDaemon {
155
157
return
156
158
default :
157
159
logger. error ( " mutagen daemon exited unexpectedly " )
158
- self . state = . failed( " File sync daemon terminated unexpectedly " )
160
+ self . state = . failed( . terminatedUnexpectedly )
159
161
}
160
162
}
161
163
}
@@ -170,11 +172,38 @@ public class MutagenDaemon: FileSyncDaemon {
170
172
public enum DaemonState {
171
173
case running
172
174
case stopped
173
- case failed( String )
175
+ case failed( DaemonError )
174
176
case unavailable
177
+
178
+ var description : String {
179
+ switch self {
180
+ case . running:
181
+ " Running "
182
+ case . stopped:
183
+ " Stopped "
184
+ case let . failed( error) :
185
+ " Failed: \( error) "
186
+ case . unavailable:
187
+ " Unavailable "
188
+ }
189
+ }
175
190
}
176
191
177
192
public enum DaemonError : Error {
178
193
case daemonStartFailure( Error )
179
194
case connectionFailure( Error )
195
+ case terminatedUnexpectedly
196
+
197
+ var description : String {
198
+ switch self {
199
+ case let . daemonStartFailure( error) :
200
+ " Daemon start failure: \( error) "
201
+ case let . connectionFailure( error) :
202
+ " Connection failure: \( error) "
203
+ case . terminatedUnexpectedly:
204
+ " Daemon terminated unexpectedly "
205
+ }
206
+ }
207
+
208
+ var localizedDescription : String { description }
180
209
}
0 commit comments