Airgapped-Wallet-Community/Sources/AirgappedSigning/Checked.swift
2019-04-24 00:43:27 -07:00

69 lines
2.0 KiB
Swift

//
// Checked.swift
// AirgappedSigning
//
// Created by Wolf McNally on 4/23/19.
//
// Copyright © 2019 Blockchain Commons.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import Foundation
public protocol Checked {
/// Performs second-level validation and throws if it fails.
func check() throws
}
func checkName(_ name: String?, context: String) throws {
if let name = name {
try checkNotEmpty(name, context: context)
}
}
func checkAsset(_ asset: String, context: String) throws {
guard ["BTC", "BTCT"].contains(asset) else {
throw AirgappedSigningError("\(context): Unsupported asset: \(asset).")
}
}
func checkNotEmpty(_ string: String, context: String) throws {
guard !string.isEmpty else {
throw AirgappedSigningError("\(context): Must be non-empty.")
}
}
func checkNotEmpty(_ data: Data, context: String) throws {
guard !data.isEmpty else {
throw AirgappedSigningError("\(context): Must be non-empty.")
}
}
func checkNotEmpty<C>(_ collection: C, context: String) throws where C: Collection {
guard !collection.isEmpty else {
throw AirgappedSigningError("\(context): Must be non-empty.")
}
}
func checkNotNegative<N: BinaryInteger>(_ n: N, context: String) throws {
guard n >= 0 else {
throw AirgappedSigningError("\(context): Must be non-negative.")
}
}
func checkPositive<N: BinaryInteger>(_ n: N, context: String) throws {
guard n > 0 else {
throw AirgappedSigningError("\(context): Must be positive.")
}
}