Generate SSD logging wrappers from typed Jerboa

ober

0da2d7daee5a284faffbcc26b4267456d3be321b

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index ad03588..3715483 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -7,6 +7,7 @@
         (export make-BoxType BoxType? BoxType-id BoxType-name box-type-display
                 boxTypeDisplays boxTypeById boxTypeDisplayById
                 addNullableBoxType)
+        (type Int)
         (type Int32)
         (record BoxType
           ((id : String)
@@ -4934,6 +4935,9 @@
                 mainActivityRestoredViewportFor
                 mainActivityDisplayName mainActivityLoadPdf
                 mainActivityPdfPageCount mainActivityRenderPdfPage
+                mainActivityInstallClientCrashLogger
+                mainActivityLogClientEvent
+                mainActivityLogDetectResultRaw mainActivitySetStatusRaw
                 mainActivityInitialPickerUri mainActivityOpenPdf
                 mainActivityOpenAnyPdf mainActivityChooseSsdPdfFolder
                 mainActivityRequestDownloadAccess
@@ -5273,6 +5277,15 @@
                   (context : MainActivity)
                   (session : SsdSession)) : Int32
           (kotlin-call applyDefaultOcrGuesses))
+        (extern (detectResultLogFieldsRawForUi
+                  (stage : String)
+                  (session : SsdSession)
+                  (detectorSource : String)
+                  (learnedGuesses : Int32)
+                  (ocrGuesses : Int32)
+                  (nativeAvailable : Bool)
+                  (nativeError : String)) : JSONObject
+          (kotlin-call detectResultLogFields))
         (extern (detectFailedLogFieldsRawForUi
                   (sourceKey : String)
                   (forceDetect : Bool)
@@ -5280,6 +5293,9 @@
                   (nativeError : String)
                   (error : JSONObject)) : JSONObject
           (kotlin-call detectFailedLogFields))
+        (extern (statusLogFieldsRawForUi
+                  (text : String)) : JSONObject
+          (kotlin-call statusLogFields))
         (extern (windowSetSoftInputMode (window : Window) (mode : Int32)) : Unit
           (kotlin-member-call setSoftInputMode))
         (extern (alertDialogIsShowing (dialog : AlertDialog)) : Bool
@@ -5935,10 +5951,6 @@
                   (activity : MainActivity)
                   (callback : (-> Unit))) : Unit
           (kotlin-member-call runOnUiThread))
-        (extern (mainActivitySetStatusRaw
-                  (activity : MainActivity)
-                  (text : String)) : Unit
-          (kotlin-member-call setStatus))
         (extern (mainActivityFindDownloadSsdPdfsRaw
                   (activity : MainActivity)) : (List SsdPdfChoice)
           (kotlin-member-call findDownloadSsdPdfs))
@@ -5956,14 +5968,6 @@
                   (payload : JSONObject)
                   (readTimeoutMillis : Int32)) : Unit
           (kotlin-member-call sendClientLog))
-        (extern (mainActivityLogDetectResultRaw
-                  (activity : MainActivity)
-                  (stage : String)
-                  (session : SsdSession)
-                  (detectorSource : String)
-                  (learnedGuesses : Int32)
-                  (ocrGuesses : Int32)) : Unit
-          (kotlin-member-call logDetectResult))
         (extern (mainActivityThrowableLogFromExceptionRaw
                   (activity : MainActivity)
                   (error : Exception)) : JSONObject
@@ -5976,6 +5980,23 @@
                   (activity : MainActivity)
                   (view : TextView)) : Unit
           (kotlin-member-set status))
+        (extern (mainActivityStatusViewRaw
+                  (activity : MainActivity)) : TextView
+          (kotlin-member-get status))
+        (extern (textViewTextSetRaw
+                  (view : TextView)
+                  (text : String)) : Unit
+          (kotlin-member-set text))
+        (extern (clientCrashLoggerInstalledValueRaw) : Bool
+          (kotlin-call clientCrashLoggerInstalledValue))
+        (extern (clientCrashLoggerInstalledSetRaw
+                  (enabled : Bool)) : Unit
+          (kotlin-call clientCrashLoggerInstalledSet))
+        (extern (mainActivityInstallClientCrashLoggerHandlerRaw
+                  (activity : MainActivity)
+                  (readTimeoutMillis : Int32)
+                  (joinTimeoutMillis : Int)) : Unit
+          (kotlin-call mainActivityInstallClientCrashLoggerHandler))
         (def (normalizeFiringArc (value : String)) : String
           (string-uppercase (string-trim value)))
         (def (normalizeLabel (value : String)) : String
@@ -7832,6 +7853,58 @@
         (def (mainActivitySetReviewView (activity : MainActivity)
                                         (view : SsdReviewView)) : Unit
           (mainActivityReviewViewSet activity view))
+        (def (mainActivityInstallClientCrashLogger
+               (activity : MainActivity)
+               (readTimeoutMillis : Int32)) : Unit
+          (if (clientCrashLoggerInstalledValueRaw)
+            (begin)
+            (begin
+              (clientCrashLoggerInstalledSetRaw #t)
+              (mainActivityInstallClientCrashLoggerHandlerRaw
+                activity
+                readTimeoutMillis
+                (int (+ readTimeoutMillis (int32 500)))))))
+        (def (mainActivityLogClientEvent
+               (activity : MainActivity)
+               (event : String)
+               (fields : JSONObject
+                 (default (emptyJsonObject)))) : Unit
+          (mainActivityLogClientEventAsync
+            activity
+            event
+            fields
+            (mainActivityClientLogReadTimeoutMillisValue)))
+        (def (mainActivityLogDetectResultRaw
+               (activity : MainActivity)
+               (stage : String)
+               (session : SsdSession)
+               (detectorSource : String)
+               (learnedGuesses : Int32)
+               (ocrGuesses : Int32)) : Unit
+          (mainActivityLogClientEvent
+            activity
+            "ssd-detect-result"
+            (detectResultLogFieldsRawForUi
+              stage
+              session
+              detectorSource
+              learnedGuesses
+              ocrGuesses
+              (ssdVisionAvailableRawForUi)
+              (ssdVisionLoadErrorMessageRawForUi))))
+        (def (mainActivitySetStatusRaw
+               (activity : MainActivity)
+               (text : String)) : Unit
+          (begin
+            (textViewTextSetRaw
+              (mainActivityStatusViewRaw activity)
+              text)
+            (if (isErrorStatus text)
+              (mainActivityLogClientEvent
+                activity
+                "ssd-status-error"
+                (statusLogFieldsRawForUi text))
+              (begin))))
         (def (truthStoreApplyTruthAndPrune
                (store : TruthStore)
                (session : SsdSession)) : Unit
@@ -12254,11 +12327,11 @@
        "    internal val boxTypeDisplays: List<String> by lazy { boxTypeDisplays(boxTypesLoadAndroid(this)) }"
        "    override fun onCreate(savedInstanceState: Bundle?) {"
        "        super.onCreate(savedInstanceState)"
-       "        installClientCrashLogger()"
-       "        logClientEvent(\"ssd-app-start\")"
+	       "        mainActivityInstallClientCrashLogger(this, CLIENT_LOG_CRASH_TIMEOUT_MS)"
+	       "        mainActivityLogClientEvent(this, \"ssd-app-start\")"
        "        mainActivitySetTruthStore(this, TruthStore(this))"
        "        setContentView(buildUi())"
-       "        setStatus(startupStatus(truthStoreStorageSummary(truthStore)))"
+	       "        mainActivitySetStatusRaw(this, startupStatus(truthStoreStorageSummary(truthStore)))"
 	       "        mainActivityRestoreLastPdf(this)"
        "        mainActivitySeedBundledTruthAsync(this, truthStore)"
        "    }"
@@ -12451,43 +12524,8 @@
        "            }"
        "            }"
        "    }"
-       ""
-       "    private fun installClientCrashLogger() {"
-       "        if (clientCrashLoggerInstalled) return"
-       "        clientCrashLoggerInstalled = true"
-       "        mainActivityInstallClientCrashLoggerHandler("
-       "            this,"
-       "            CLIENT_LOG_CRASH_TIMEOUT_MS,"
-       "            (CLIENT_LOG_CRASH_TIMEOUT_MS + 500).toLong()"
-       "        )"
-       "    }"
-       ""
-       "    private fun logClientEvent(event: String, fields: JSONObject = emptyJsonObject()) {"
-       "        mainActivityLogClientEventAsync(this, event, fields, CLIENT_LOG_READ_TIMEOUT_MS)"
-       "    }"
-       ""
-       "    internal fun logDetectResult("
-       "        stage: String,"
-       "        session: SsdSession,"
-       "        detectorSource: String,"
-       "        learnedGuesses: Int = 0,"
-       "        ocrGuesses: Int = 0"
-       "    ) {"
-       "        logClientEvent("
-       "            \"ssd-detect-result\","
-       "            detectResultLogFields("
-       "                stage,"
-       "                session,"
-       "                detectorSource,"
-       "                learnedGuesses,"
-       "                ocrGuesses,"
-       "                ssdVisionAvailable(),"
-       "                ssdVisionLoadErrorMessage()"
-       "            )"
-       "        )"
-       "    }"
-       ""
-       "    internal fun sendClientLog(payload: JSONObject, readTimeoutMillis: Int) {"
+	       ""
+	       "    internal fun sendClientLog(payload: JSONObject, readTimeoutMillis: Int) {"
        "        val bytes = textUtf8Bytes(payload.toString())"
        "        val connection = (URL(CLIENT_LOG_ENDPOINT).openConnection() as HttpsURLConnection).apply {"
        "            requestMethod = \"POST\""
@@ -12547,15 +12585,8 @@
        "        val stackText = truncateClientLogStack(stack)"
        "        return throwableLogJson(error.javaClass.name, nullableTextOrEmpty(error.message), stackText)"
        "    }"
-       ""
-       "    internal fun setStatus(text: String) {"
-       "        status.text = text"
-       "        if (isErrorStatus(text)) {"
-       "            logClientEvent(\"ssd-status-error\", statusLogFields(text))"
-       "        }"
-       "    }"
-       ""
-       "}"
+	       ""
+	       "}"
        ))
     (typed-kotlin-file "com/sfb/ssdreview/MainActivityConstants.kt"
       (typed-library (com sfb ssdreview)
@@ -12583,6 +12614,8 @@
                 MAX_SSD_PDF_CHOICES
                 FAST_TRUTH_GROUP_THRESHOLD
                 clientCrashLoggerInstalled
+                clientCrashLoggerInstalledValue
+                clientCrashLoggerInstalledSet
                 CLIENT_LOG_ENDPOINT
                 CLIENT_LOG_CONNECT_TIMEOUT_MS
                 CLIENT_LOG_READ_TIMEOUT_MS
@@ -12638,6 +12671,10 @@
           (modifiers internal const))
         (var clientCrashLoggerInstalled : Bool #f
           (modifiers @Volatile internal))
+        (def (clientCrashLoggerInstalledValue) : Bool
+          clientCrashLoggerInstalled)
+        (def (clientCrashLoggerInstalledSet (enabled : Bool)) : Unit
+          (set! clientCrashLoggerInstalled enabled))
         (val CLIENT_LOG_ENDPOINT : String "https://10.66.60.2:8799/api/client-log"
           (modifiers internal const))
         (val CLIENT_LOG_CONNECT_TIMEOUT_MS : Int32 (int32 2500)