PureYAMLStreaming/Sources/PureYAMLStreamingWasmSmoke/main.swift
Mihaela Mihaljevic 9fd46932d1 fix: harden browser WASM benchmark
Make the live benchmark report Swift-measured parse timing, use deterministic browser CI, and deploy only after local and live Pages validation pass.
2026-06-06 23:20:03 +02:00

93 lines
2.4 KiB
Swift

import Foundation
import PureYAML
import PureYAMLStreaming
struct SmokeResult: Encodable {
var ok: Bool
var inputByteCount: Int
var documentCount: Int
var firstName: String?
var lastName: String?
var parseMilliseconds: Double
var message: String
}
let fallbackYAML = Data(
"""
---
name: browser-0
enabled: true
nested:
index: 0
---
name: browser-1
enabled: false
nested:
index: 1
---
name: browser-2
enabled: true
nested:
index: 2
""".utf8,
)
do {
let readsStandardInput = CommandLine.arguments.count > 1
let input = readsStandardInput
? FileHandle.standardInput.readDataToEndOfFile()
: Data()
let yaml = readsStandardInput ? input : fallbackYAML
let parser = PureYAMLStreaming.Parser(chunkSize: 31)
let parseStart = Date()
var documentCount = 0
var firstName: String?
var lastName: String?
try parser.parseDocuments(data: yaml) { document in
let name = stringValue("name", in: document.value)
if documentCount == 0 {
firstName = name
}
lastName = name
documentCount += 1
}
let parseMilliseconds = Date().timeIntervalSince(parseStart) * 1_000
let ok = documentCount > 0
let result = SmokeResult(
ok: ok,
inputByteCount: yaml.count,
documentCount: documentCount,
firstName: firstName,
lastName: lastName,
parseMilliseconds: parseMilliseconds,
message: ok ? "PureYAMLStreaming WASM parse passed" : "PureYAMLStreaming WASM parse found no documents",
)
print(try renderJSON(result))
} catch {
let result = SmokeResult(
ok: false,
inputByteCount: 0,
documentCount: 0,
firstName: nil,
lastName: nil,
parseMilliseconds: 0,
message: String(describing: error),
)
print((try? renderJSON(result)) ?? #"{"ok":false,"message":"failed to render error"}"#)
}
func stringValue(_ key: String, in value: PureYAML.Model.Value) -> String? {
guard case let .mapping(mapping) = value,
case let .string(string)? = mapping[key]
else {
return nil
}
return string
}
func renderJSON<Value: Encodable>(_ value: Value) throws -> String {
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
return String(decoding: try encoder.encode(value), as: UTF8.self)
}