Signal-iOS/Scripts/translation-tool/src/LimitedThrowingTaskGroup.swift
Max Radermacher 39135003a4 Fetch translations from Smartling
Smartling exposes a simple REST API that’s fairly easy to adopt.

Some differences from the old approach:

- We get UTF-8 back instead of UTF-16, so there’s no need to use iconv.

- We don’t support “nb_NO”, so we don’t need to remove it each time we
  fetch translations.

- We get back English fallbacks for .stringsdict files, so there’s no
  need to merge them manually ourselves.

- We no longer support country-specific locales *and* the root language,
  so we don’t need to merge, for example, “es” into “es-MX”.

- We handle language mapping & duplication inside the Swift script,
  which will hopefully be more reliable than cp’ing directories.
2022-09-29 16:13:06 -07:00

30 lines
1.0 KiB
Swift

//
// Copyright (c) 2022 Open Whisper Systems. All rights reserved.
//
import Foundation
struct LimitedThrowingTaskGroup {
var taskGroup: ThrowingTaskGroup<Void, Error>
var remainingCapacity: Int
mutating func addTask(operation: @escaping @Sendable () async throws -> Void) async throws {
if remainingCapacity > 0 {
remainingCapacity -= 1
} else {
// Once we've kicked off the maximum number of concurrent tasks, we always
// wait for one to finish before starting the next one.
try await taskGroup.next()
}
taskGroup.addTask(operation: operation)
}
}
func withLimitedThrowingTaskGroup(limit: Int, body: (inout LimitedThrowingTaskGroup) async throws -> Void) async rethrows {
try await withThrowingTaskGroup(of: Void.self) { taskGroup in
var limitedTaskGroup = LimitedThrowingTaskGroup(taskGroup: taskGroup, remainingCapacity: limit)
try await body(&limitedTaskGroup)
try await taskGroup.waitForAll()
}
}