1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//! # 3. State and Flow Diagram
//!
//! Once the connection between client and server is established, an
//! IMAP4rev1 connection is in one of four states.  The initial
//! state is identified in the server greeting.  Most commands are
//! only valid in certain states.  It is a protocol error for the
//! client to attempt a command while the connection is in an
//! inappropriate state, and the server will respond with a BAD or
//! NO (depending upon server implementation) command completion
//! result.
//!
//! ```text
//!           +----------------------+
//!           |connection established|
//!           +----------------------+
//!                      ||
//!                      \/
//!    +--------------------------------------+
//!    |          server greeting             |
//!    +--------------------------------------+
//!              || (1)       || (2)        || (3)
//!              \/           ||            ||
//!    +-----------------+    ||            ||
//!    |Not Authenticated|    ||            ||
//!    +-----------------+    ||            ||
//!     || (7)   || (4)       ||            ||
//!     ||       \/           \/            ||
//!     ||     +----------------+           ||
//!     ||     | Authenticated  |<=++       ||
//!     ||     +----------------+  ||       ||
//!     ||       || (7)   || (5)   || (6)   ||
//!     ||       ||       \/       ||       ||
//!     ||       ||    +--------+  ||       ||
//!     ||       ||    |Selected|==++       ||
//!     ||       ||    +--------+           ||
//!     ||       ||       || (7)            ||
//!     \/       \/       \/                \/
//!    +--------------------------------------+
//!    |               Logout                 |
//!    +--------------------------------------+
//!                      ||
//!                      \/
//!        +-------------------------------+
//!        |both sides close the connection|
//!        +-------------------------------+
//!
//! (1) connection without pre-authentication (OK greeting)
//! (2) pre-authenticated connection (PREAUTH greeting)
//! (3) rejected connection (BYE greeting)
//! (4) successful LOGIN or AUTHENTICATE command
//! (5) successful SELECT or EXAMINE command
//! (6) CLOSE command, or failed SELECT or EXAMINE command
//! (7) LOGOUT command, server shutdown, or connection closed
//! ```

#[cfg(feature = "serdex")]
use serde::{Deserialize, Serialize};

use crate::types::mailbox::Mailbox;

/// State of the IMAP4rev1 connection.
#[cfg_attr(feature = "serdex", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
pub enum State {
    /// ## 3.1. Not Authenticated State
    ///
    /// In the not authenticated state, the client MUST supply
    /// authentication credentials before most commands will be
    /// permitted.  This state is entered when a connection starts
    /// unless the connection has been pre-authenticated.
    NotAuthenticated,

    /// ## 3.2. Authenticated State
    ///
    /// In the authenticated state, the client is authenticated and MUST
    /// select a mailbox to access before commands that affect messages
    /// will be permitted.  This state is entered when a
    /// pre-authenticated connection starts, when acceptable
    /// authentication credentials have been provided, after an error in
    /// selecting a mailbox, or after a successful CLOSE command.
    Authenticated,

    /// ## 3.3. Selected State
    ///
    /// In a selected state, a mailbox has been selected to access.
    /// This state is entered when a mailbox has been successfully
    /// selected.
    Selected(Mailbox),

    /// ## 3.4. Logout State
    ///
    /// In the logout state, the connection is being terminated.  This
    /// state can be entered as a result of a client request (via the
    /// LOGOUT command) or by unilateral action on the part of either
    /// the client or server.
    ///
    /// If the client requests the logout state, the server MUST send an
    /// untagged BYE response and a tagged OK response to the LOGOUT
    /// command before the server closes the connection; and the client
    /// MUST read the tagged OK response to the LOGOUT command before
    /// the client closes the connection.
    ///
    /// A server MUST NOT unilaterally close the connection without
    /// sending an untagged BYE response that contains the reason for
    /// having done so.  A client SHOULD NOT unilaterally close the
    /// connection, and instead SHOULD issue a LOGOUT command.  If the
    /// server detects that the client has unilaterally closed the
    /// connection, the server MAY omit the untagged BYE response and
    /// simply close its connection.
    Logout,

    /// Extension IDLE
    IdleAuthenticated(String),

    /// Extension IDLE
    IdleSelected(String, Mailbox),
}