blob: bab30b763f0d6cba6a3dd6a916f31271dc4de211 [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
import Foundation
public enum SyncbaseError: ErrorType, CustomStringConvertible {
case AlreadyConfigured
case NotConfigured
case NotLoggedIn
case NotAuthorized
case NotInDevMode
case UnknownBatch
case NotBoundToBatch
case ReadOnlyBatch
case ConcurrentBatch
case BlobNotCommitted
case SyncgroupJoinFailed
case BadExecStreamHeader
case InvalidPermissionsChange
case Exist
case NoExist
case InvalidName(name: String)
case CorruptDatabase(path: String)
case InvalidOperation(reason: String)
case InvalidUTF8(invalidUtf8: String)
case CastError(obj: Any)
case IllegalArgument(detail: String)
case UnknownVError(err: VError)
init(_ err: VError) {
// TODO(zinman): Make VError better by having the proper arguments transmitted across
// so we don't have to use err.msg to repeat our messages.
switch err.id {
case "v.io/v23/services/syncbase.NotInDevMode": self = SyncbaseError.NotInDevMode
case "v.io/v23/services/syncbase.InvalidName": self = SyncbaseError.InvalidName(name: err.msg)
case "v.io/v23/services/syncbase.CorruptDatabase": self = SyncbaseError.CorruptDatabase(path: err.msg)
case "v.io/v23/services/syncbase.UnknownBatch": self = SyncbaseError.UnknownBatch
case "v.io/v23/services/syncbase.NotBoundToBatch": self = SyncbaseError.NotBoundToBatch
case "v.io/v23/services/syncbase.ReadOnlyBatch": self = SyncbaseError.ReadOnlyBatch
case "v.io/v23/services/syncbase.ConcurrentBatch": self = SyncbaseError.ConcurrentBatch
case "v.io/v23/services/syncbase.BlobNotCommitted": self = SyncbaseError.BlobNotCommitted
case "v.io/v23/services/syncbase.SyncgroupJoinFailed": self = SyncbaseError.SyncgroupJoinFailed
case "v.io/v23/services/syncbase.BadExecStreamHeader": self = SyncbaseError.BadExecStreamHeader
case "v.io/v23/services/syncbase.InvalidPermissionsChange": self = SyncbaseError.InvalidPermissionsChange
case "v.io/v23/verror.Exist": self = SyncbaseError.Exist
case "v.io/v23/verror.NoExist": self = SyncbaseError.NoExist
default: self = SyncbaseError.UnknownVError(err: err)
}
}
public var description: String {
switch (self) {
case .AlreadyConfigured: return "Already configured"
case .NotConfigured: return "Not configured (via Syncbase.configure)"
case .NotLoggedIn: return "Not logged in (via Syncbase.login)"
case .NotAuthorized: return "No valid blessings; create new blessings using oauth"
case .NotInDevMode: return "Not running with --dev=true"
case .UnknownBatch: return "Unknown batch, perhaps the server restarted"
case .NotBoundToBatch: return "Not bound to batch"
case .ReadOnlyBatch: return "Batch is read-only"
case .ConcurrentBatch: return "Concurrent batch"
case .BlobNotCommitted: return "Blob is not yet committed"
case .SyncgroupJoinFailed: return "Syncgroup join failed"
case .BadExecStreamHeader: return "Exec stream header improperly formatted"
case .InvalidPermissionsChange: return "The sequence of permission changes is invalid"
case .NoExist: return "Does not exist"
case .Exist: return "Already exists"
case .InvalidName(let name): return "Invalid name: \(name)"
case .CorruptDatabase(let path):
return "Database corrupt, moved to path \(path); client must create a new database"
case .InvalidOperation(let reason): return "Invalid operation: \(reason)"
case .InvalidUTF8(let invalidUtf8): return "Unable to convert to UTF-8: \(invalidUtf8)"
case .CastError(let obj): return "Unable to convert to cast: \(obj)"
case .IllegalArgument(let detail): return "Illegal argument: \(detail)"
case .UnknownVError(let err): return "Unknown error: \(err)"
}
}
}