Skip to content

Commit

Permalink
Log Rust crash error output to Crashlytics
Browse files Browse the repository at this point in the history
  • Loading branch information
sindresorhus committed Feb 21, 2023
1 parent d05d5a8 commit db66ef1
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Gifski/Gifski.swift
@@ -1,4 +1,5 @@
import Cocoa
import FirebaseCrashlytics

final class Gifski {
enum Loop {
Expand Down Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions Gifski/GifskiWrapper.swift
Expand Up @@ -8,12 +8,14 @@ final class GifskiWrapper {
case rgb
}

typealias ErrorMessageCallback = (String) -> Void
typealias ProgressCallback = () -> Int
typealias WriteCallback = (Int, UnsafePointer<UInt8>) -> Int

private let pointer: OpaquePointer
private var unmanagedSelf: Unmanaged<GifskiWrapper>!
private var hasFinished = false
private var errorMessageCallback: ErrorMessageCallback!
private var progressCallback: ProgressCallback!
private var writeCallback: WriteCallback!

Expand All @@ -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<GifskiWrapper>.fromOpaque(context).takeUnretainedValue()
this.errorMessageCallback(String(cString: message))
},
unmanagedSelf.toOpaque()
)
}

func setProgressCallback(_ callback: @escaping ProgressCallback) {
guard !hasFinished else {
return
Expand Down

0 comments on commit db66ef1

Please sign in to comment.