import 'dart:typed_data'; class BootloaderDfuFirmwareMetadata { const BootloaderDfuFirmwareMetadata({ required this.totalLength, required this.crc32, required this.appStart, required this.imageVersion, required this.sessionId, required this.flags, required this.vectorStackPointer, required this.vectorReset, }); final int totalLength; final int crc32; final int appStart; final int imageVersion; final int sessionId; final int flags; final int vectorStackPointer; final int vectorReset; } class BootloaderDfuPreparedFirmware { const BootloaderDfuPreparedFirmware({ required this.fileName, required this.fileBytes, required this.metadata, this.filePath, }); final String fileName; final String? filePath; final Uint8List fileBytes; final BootloaderDfuFirmwareMetadata metadata; } enum FirmwareSelectionFailureReason { canceled, malformedSelection, unsupportedExtension, emptyFile, imageTooSmall, imageTooLarge, invalidVectorTable, readFailed, } class FirmwareSelectionFailure { const FirmwareSelectionFailure({ required this.reason, required this.message, }); final FirmwareSelectionFailureReason reason; final String message; } class FirmwareFileSelectionResult { const FirmwareFileSelectionResult._({ this.firmware, this.failure, }); final BootloaderDfuPreparedFirmware? firmware; final FirmwareSelectionFailure? failure; bool get isSuccess => firmware != null; bool get isCanceled => failure?.reason == FirmwareSelectionFailureReason.canceled; static FirmwareFileSelectionResult success( BootloaderDfuPreparedFirmware firmware) { return FirmwareFileSelectionResult._(firmware: firmware); } static FirmwareFileSelectionResult failed(FirmwareSelectionFailure failure) { return FirmwareFileSelectionResult._(failure: failure); } }