From db66ef11eabaaa8264a7252dd75a95e48e4ed9a2 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 21 Feb 2023 16:40:58 +0700 Subject: [PATCH] Log Rust crash error output to Crashlytics --- Gifski/Gifski.swift | 5 +++++ Gifski/GifskiWrapper.swift | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/Gifski/Gifski.swift b/Gifski/Gifski.swift index f377f82..0e6f22f 100644 --- a/Gifski/Gifski.swift +++ b/Gifski/Gifski.swift @@ -1,4 +1,5 @@ import Cocoa +import FirebaseCrashlytics final class Gifski { enum Loop { @@ -49,6 +50,10 @@ final class Gifski { self.wrapper = wrapper + wrapper.setErrorMessageCallback { + Crashlytics.crashlytics().log($0) + } + wrapper.setProgressCallback { [weak self] in guard let self else { return 0 diff --git a/Gifski/GifskiWrapper.swift b/Gifski/GifskiWrapper.swift index d675c91..a7cc71a 100644 --- a/Gifski/GifskiWrapper.swift +++ b/Gifski/GifskiWrapper.swift @@ -8,12 +8,14 @@ final class GifskiWrapper { case rgb } + typealias ErrorMessageCallback = (String) -> Void typealias ProgressCallback = () -> Int typealias WriteCallback = (Int, UnsafePointer) -> Int private let pointer: OpaquePointer private var unmanagedSelf: Unmanaged! private var hasFinished = false + private var errorMessageCallback: ErrorMessageCallback! private var progressCallback: ProgressCallback! private var writeCallback: WriteCallback! @@ -38,6 +40,30 @@ final class GifskiWrapper { } } + func setErrorMessageCallback(_ callback: @escaping ErrorMessageCallback) { + guard !hasFinished else { + return + } + + errorMessageCallback = callback + + gifski_set_error_message_callback( + pointer, + { message, context in // swiftlint:disable:this opening_brace + guard + let message, + let context + else { + return + } + + let this = Unmanaged.fromOpaque(context).takeUnretainedValue() + this.errorMessageCallback(String(cString: message)) + }, + unmanagedSelf.toOpaque() + ) + } + func setProgressCallback(_ callback: @escaping ProgressCallback) { guard !hasFinished else { return