Coverage Summary for Class: SyncTelemetry (com.georgeci.moneysurfer.sync.telemetry)

Class Method, % Branch, % Line, %
SyncTelemetry$NoOp 100% (5/5) 100% (5/5)
Total 100% (5/5) 100% (5/5)


 package com.georgeci.moneysurfer.sync.telemetry
 
 import com.georgeci.moneysurfer.sync.api.SyncError
 import com.georgeci.moneysurfer.sync.api.SyncReason
 import com.georgeci.moneysurfer.sync.api.SyncRequestId
 import com.georgeci.moneysurfer.sync.api.SyncScope
 import com.georgeci.moneysurfer.sync.api.SyncStep
 import com.georgeci.moneysurfer.sync.api.SyncSummary
 import kotlin.time.Duration
 
 /**
  * Hook for emitting structured sync events. Default binding is [NoOp];
  * `:data` provides a Kermit-backed implementation that logs human-readable
  * lines. Replace with a metrics-pipeline binding (Firebase Analytics,
  * Crashlytics breadcrumbs, or a custom collector) when one lands.
  *
  * See sync.md ยง4.2.
  */
 interface SyncTelemetry {
 
     fun onSyncStarted(requestId: SyncRequestId, reasons: Set<SyncReason>, scope: SyncScope)
 
     fun onStepEntered(requestId: SyncRequestId, step: SyncStep)
 
     fun onSyncCompleted(requestId: SyncRequestId, summary: SyncSummary, duration: Duration)
 
     fun onSyncFailed(requestId: SyncRequestId, error: SyncError, duration: Duration)
 
     fun onSyncCancelled(requestId: SyncRequestId, duration: Duration)
 
     object NoOp : SyncTelemetry {
         override fun onSyncStarted(requestId: SyncRequestId, reasons: Set<SyncReason>, scope: SyncScope) = Unit
         override fun onStepEntered(requestId: SyncRequestId, step: SyncStep) = Unit
         override fun onSyncCompleted(requestId: SyncRequestId, summary: SyncSummary, duration: Duration) = Unit
         override fun onSyncFailed(requestId: SyncRequestId, error: SyncError, duration: Duration) = Unit
         override fun onSyncCancelled(requestId: SyncRequestId, duration: Duration) = Unit
     }
 }