Coverage Summary for Class: SyncError (com.georgeci.moneysurfer.sync.api)

Class Method, % Branch, % Line, % Instruction, %
SyncError$AuthRequired 100% (1/1) 100% (1/1) 100% (1/1)
SyncError$Cancelled 100% (1/1) 100% (1/1) 100% (1/1)
SyncError$NetworkUnavailable 100% (1/1) 100% (1/1) 100% (3/3)
SyncError$PermissionDenied 100% (1/1) 100% (1/1) 100% (1/1)
SyncError$StorageError 100% (2/2) 100% (2/2) 100% (9/9)
SyncError$Unknown 100% (1/1) 100% (2/2) 100% (12/12)
SyncError$UnsupportedAppVersion 100% (2/2) 100% (2/2) 100% (9/9)
Total 100% (9/9) 100% (10/10) 100% (36/36)


 package com.georgeci.moneysurfer.sync.api
 
 import arrow.core.Either
 
 /**
  * Standalone sync error type — NOT nested under any common `AppError`.
  * See SyncCoordinatorFAQ.md №11, №12.
  */
 sealed interface SyncError {
     val isRetryable: Boolean
 
     data object Cancelled : SyncError {
         override val isRetryable: Boolean = false
     }
 
     data object NetworkUnavailable : SyncError {
         override val isRetryable: Boolean = true
     }
 
     data object AuthRequired : SyncError {
         override val isRetryable: Boolean = false
     }
 
     data object PermissionDenied : SyncError {
         override val isRetryable: Boolean = false
     }
 
     /**
      * The local app build is older than `appConfig/mobile.minSupportedAppVersionCode`.
      * UI must direct the user to the store; sync stays disabled until the
      * app is upgraded. See block.md.
      */
     data class UnsupportedAppVersion(val message: String) : SyncError {
         override val isRetryable: Boolean = false
     }
 
     data class StorageError(val cause: Throwable) : SyncError {
         override val isRetryable: Boolean = false
     }
 
     data class Unknown(val cause: Throwable) : SyncError {
         override val isRetryable: Boolean = true
     }
 }
 
 typealias SyncResult<T> = Either<SyncError, T>