|
3 | 3 | class Net::IMAP::FakeServer |
4 | 4 |
|
5 | 5 | class ConnectionState |
| 6 | + Error = Class.new(RuntimeError) |
| 7 | + |
| 8 | + class InvalidStateChange < Error |
| 9 | + def initialize(msg = "invalid state change", *args, **change) |
| 10 | + msg = "%s: %p" % [msg, change] if change |
| 11 | + super(msg, *args) |
| 12 | + end |
| 13 | + end |
| 14 | + |
| 15 | + class AlreadyLoggedOut < InvalidStateChange |
| 16 | + def initialize(msg = "already logged out", *args) |
| 17 | + super(msg, *args) |
| 18 | + end |
| 19 | + end |
| 20 | + |
6 | 21 | attr_reader :user |
7 | 22 | attr_reader :session |
8 | 23 | attr_reader :enabled |
@@ -46,29 +61,30 @@ def selected?; name == :selected end |
46 | 61 | def logout?; name == :logout end |
47 | 62 |
|
48 | 63 | def authenticate(user) |
49 | | - not_authenticated? or raise "invalid state change" |
| 64 | + not_authenticated? or raise InvalidStateChange, name => :authenticated |
50 | 65 | user or raise ArgumentError |
51 | 66 | @user = user |
52 | 67 | end |
53 | 68 |
|
54 | 69 | def select(mbox:, **options) |
55 | | - authenticated? || selected? or raise "invalid state change" |
| 70 | + authenticated? || selected? or raise InvalidStateChange, name => :selected |
56 | 71 | mbox or raise ArgumentError |
57 | 72 | @session = Session.new mbox: mbox, **options |
58 | 73 | end |
59 | 74 |
|
60 | 75 | def unselect |
61 | | - selected? or raise "invalid state change" |
| 76 | + selected? or raise InvalidStateChange, selected: :authenticated |
62 | 77 | @session = nil |
63 | 78 | end |
64 | 79 |
|
65 | 80 | def unauthenticate |
66 | | - authenticated? || selected? or raise "invalid state change" |
| 81 | + authenticated? || selected? or |
| 82 | + raise InvalidStateChange, name => :not_authenticated |
67 | 83 | @user = @selected = nil |
68 | 84 | end |
69 | 85 |
|
70 | 86 | def logout |
71 | | - !logout? or raise "already logged out" |
| 87 | + !logout? or raise AlreadyLoggedOut |
72 | 88 | @logout = true |
73 | 89 | end |
74 | 90 |
|
|
0 commit comments