Sources/OSS/ClientExtensions.swift (75 lines of code) (raw):
import Foundation
public extension Client {
/// You can call this operation to query an object.
/// - Parameters:
/// - request: The request parameter to send
/// - file: URL of file
/// - Returns: The result instance.
@available(macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0, *)
func getObjectToFile(
_ request: GetObjectRequest,
_ file: URL,
_ options: OperationOptions? = nil
) async throws -> GetObjectResult {
var options = options ?? OperationOptions()
options.saveToURL = true
var result = try await getObject(request, options)
// Remove any existing file
if FileManager.default.fileExists(atPath: file.path) {
try FileManager.default.removeItem(at: file)
}
switch result.body {
case let .file(tempURL):
try FileManager.default.moveItem(
at: tempURL,
to: file
)
result.body = .file(file)
default:
throw ClientError.paramInvalidError(field: "result.body")
}
return result
}
/// Checks if the bucket exists
/// - Parameter bucket: The request parameter to send.
/// - Returns: True if the object exists, else False.
func isBucketExist(_ bucket: Swift.String) async throws -> Bool {
do {
let request = GetBucketAclRequest(bucket: bucket)
let _ = try await getBucketAcl(request)
return true
} catch {
if let serverError = error as? ServerError,
serverError.code == "NoSuchBucket"
{
return false
}
throw error
}
}
/// Checks if the object exists
/// - Parameters:
/// - bucket: he request parameter to send.
/// - key: The request parameter to send.
/// - Returns: True if the object exists, else False.
func isObjectExist(
_ bucket: Swift.String,
_ key: Swift.String,
_ versionId: Swift.String? = nil
) async throws -> Bool {
do {
let request = GetObjectMetaRequest(bucket: bucket,
key: key,
versionId: versionId)
let _ = try await getObjectMeta(request)
return true
} catch {
if let serverError = error as? ServerError {
if serverError.code == "NoSuchKey" {
return false
}
if serverError.statusCode == 404,
serverError.code == "BadErrorResponse"
{
return false
}
}
throw error
}
}
}
extension Optional {
@discardableResult
func ensureRequired(field: String) throws -> Wrapped {
if let value = self {
return value
}
throw ClientError.paramRequiredError(field: field)
}
}