@@ -40,7 +40,7 @@ const DISK_CHECK_BYTES_INTERVAL: usize = 256 * 1024;
4040pub enum DiagDeviceCtrlMessage {
4141 StopRecording ,
4242 StartRecording {
43- response_tx : Option < oneshot:: Sender < Result < ( ) , String > > > ,
43+ response_tx : Option < oneshot:: Sender < Result < ( ) , RecordingStoreError > > > ,
4444 } ,
4545 DeleteEntry {
4646 name : String ,
@@ -129,7 +129,7 @@ impl DiagTask {
129129 }
130130
131131 /// Start recording, returning an error if disk space is too low.
132- async fn start ( & mut self , qmdl_store : & mut RecordingStore ) -> Result < ( ) , String > {
132+ async fn start ( & mut self , qmdl_store : & mut RecordingStore ) -> Result < ( ) , RecordingStoreError > {
133133 self . max_type_seen = EventType :: Informational ;
134134 self . bytes_since_space_check = 0 ;
135135 self . low_space_warned = false ;
@@ -140,66 +140,54 @@ impl DiagTask {
140140 self . min_space_to_continue_mb ,
141141 ) {
142142 DiskSpaceCheck :: Critical ( mb) | DiskSpaceCheck :: Warning ( mb) => {
143- let msg = format ! (
144- "Insufficient disk space: {}MB available, {}MB required" ,
145- mb, self . min_space_to_start_mb
146- ) ;
147- error ! ( "{msg}" ) ;
148- return Err ( msg) ;
143+ return Err ( RecordingStoreError :: InsufficientDiskSpace (
144+ mb,
145+ self . min_space_to_start_mb ,
146+ ) ) ;
149147 }
150148 DiskSpaceCheck :: Ok ( mb) => {
151149 info ! ( "Starting recording with {}MB disk space available" , mb) ;
152150 }
153151 DiskSpaceCheck :: Failed => { }
154152 }
155153
156- let ( qmdl_file, analysis_file) = match qmdl_store. new_entry ( self . gps_mode ) . await {
157- Ok ( files) => files,
158- Err ( e) => {
159- let msg = format ! ( "failed creating QMDL file entry: {e}" ) ;
160- error ! ( "{msg}" ) ;
161- return Err ( msg) ;
162- }
163- } ;
154+ let ( qmdl_file, analysis_file) = qmdl_store. new_entry ( self . gps_mode ) . await ?;
155+
164156 // For fixed-mode sessions, write the configured coordinates to the sidecar
165157 // immediately so the per-session GPS is stored durably and isn't affected
166158 // by future config changes or GPS API calls.
167159 if self . gps_mode == GpsMode :: Fixed
168160 && let Some ( ( lat, lon) ) = self . gps_fixed_coords
169161 && let Some ( ( entry_idx, _) ) = qmdl_store. get_current_entry ( )
170162 {
171- match qmdl_store. open_entry_gps_for_append ( entry_idx) . await {
172- Ok ( Some ( mut gps_file) ) => {
173- let record = GpsRecord {
174- unix_ts : 0 ,
175- lat,
176- lon,
177- } ;
178- if let Ok ( json) = serde_json:: to_string ( & record) {
179- let _ = gps_file. write_all ( format ! ( "{json}\n " ) . as_bytes ( ) ) . await ;
180- }
181- }
182- Ok ( None ) => {
183- error ! ( "GPS sidecar directory not found, cannot write fixed-mode coordinates" )
184- }
185- Err ( e) => error ! ( "failed to open GPS sidecar for fixed-mode entry: {e}" ) ,
186- }
163+ let mut gps_file = qmdl_store
164+ . open_entry_gps_for_append ( entry_idx)
165+ . await ?
166+ . ok_or ( RecordingStoreError :: GpsSidecarNotFound ) ?;
167+
168+ let record = GpsRecord {
169+ unix_ts : chrono:: Utc :: now ( ) . timestamp ( ) ,
170+ lat,
171+ lon,
172+ } ;
173+ let json = serde_json:: to_string ( & record) ?;
174+ gps_file
175+ . write_all ( format ! ( "{json}\n " ) . as_bytes ( ) )
176+ . await
177+ . map_err ( RecordingStoreError :: WriteFileError ) ?;
187178 }
179+
188180 self . stop_current_recording ( ) . await ;
189181 let qmdl_writer = QmdlWriter :: new ( qmdl_file) ;
190- let analysis_writer = match AnalysisWriter :: new ( analysis_file, & self . analyzer_config ) . await
191- {
192- Ok ( writer) => Box :: new ( writer) ,
193- Err ( e) => {
194- let msg = format ! ( "failed to create analysis writer: {e}" ) ;
195- error ! ( "{msg}" ) ;
196- return Err ( msg) ;
197- }
198- } ;
182+ let analysis_writer = AnalysisWriter :: new ( analysis_file, & self . analyzer_config )
183+ . await
184+ . map_err ( RecordingStoreError :: WriteFileError ) ?;
185+
199186 self . state = DiagState :: Recording {
200187 qmdl_writer,
201- analysis_writer,
188+ analysis_writer : Box :: new ( analysis_writer ) ,
202189 } ;
190+
203191 if let Err ( e) = self
204192 . ui_update_sender
205193 . send ( display:: DisplayState :: Recording )
@@ -530,7 +518,7 @@ pub async fn start_recording(
530518
531519 match response_rx. await {
532520 Ok ( Ok ( ( ) ) ) => Ok ( ( StatusCode :: ACCEPTED , "ok" . to_string ( ) ) ) ,
533- Ok ( Err ( reason) ) => Err ( ( StatusCode :: INSUFFICIENT_STORAGE , reason) ) ,
521+ Ok ( Err ( reason) ) => Err ( ( StatusCode :: INSUFFICIENT_STORAGE , reason. to_string ( ) ) ) ,
534522 Err ( e) => Err ( (
535523 StatusCode :: INTERNAL_SERVER_ERROR ,
536524 format ! ( "failed to receive start recording response: {e}" ) ,
0 commit comments