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
use super::*;

/// The status a response should send
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CibouletteResponseStatus {
    /// HTTP 200
    Ok,
    /// HTTP 204
    OkEmpty,
    /// HTTP 202
    OkAsync,
    /// HTTP 201
    Created,
    /// HTTP 403
    Unsupported,
    /// HTTP 404
    NotFound,
    /// HTTP 409
    Conflict,
}

impl CibouletteResponseStatus {
    pub fn is_success(&self) -> bool {
        match self {
            CibouletteResponseStatus::Ok
            | CibouletteResponseStatus::OkEmpty
            | CibouletteResponseStatus::OkAsync
            | CibouletteResponseStatus::Created => true,
            CibouletteResponseStatus::Unsupported
            | CibouletteResponseStatus::NotFound
            | CibouletteResponseStatus::Conflict => false,
        }
    }

    /// Get a response status for a given request type and data.
    ///
    /// Applicable only if the request was a success
    pub fn get_status_for_ok_response<'request, 'response, B>(
        request: &dyn CibouletteRequestCommons<'request>,
        response_body: &CibouletteResponseBody<'response, B>,
    ) -> Self {
        match (request.intention(), response_body.data()) {
            (CibouletteIntention::Create, CibouletteOptionalData::Object(_)) => {
                CibouletteResponseStatus::Created
            }
            (CibouletteIntention::Create, CibouletteOptionalData::Null(_)) => {
                CibouletteResponseStatus::Ok
                // TODO : In the future, CibouletteResponseStatus::OkEmpty should be used
            }
            // TODO :   In the future, (CibouletteIntention::Delete, _) => CibouletteResponseStatus::OkEmpty should be used,
            (CibouletteIntention::Delete, _) => CibouletteResponseStatus::Ok,
            (CibouletteIntention::Read, CibouletteOptionalData::Object(_)) => {
                CibouletteResponseStatus::Ok
            }
            (CibouletteIntention::Read, CibouletteOptionalData::Null(_)) => {
                CibouletteResponseStatus::NotFound
            }
            (CibouletteIntention::Update, CibouletteOptionalData::Object(_)) => {
                CibouletteResponseStatus::Ok
            }
            (CibouletteIntention::Update, CibouletteOptionalData::Null(_)) => {
                CibouletteResponseStatus::Ok
                // TODO : In the future, CibouletteResponseStatus::OkEmpty should be used
            }
        }
    }
}