| // 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(detail: String) |
| 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 NoAccess(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(detail: err.msg) |
| 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 |
| case "v.io/v23/verror.NoAccess": self = SyncbaseError.NoAccess(detail: err.msg) |
| 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(let detail): return "Syncgroup join failed: \(detail)" |
| 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 .NoAccess(let detail): return "Access Denied: \(detail)" |
| case .UnknownVError(let err): return "Unknown error: \(err)" |
| } |
| } |
| } |