actix_settings/settings/
backlog.rs

1use std::fmt;
2
3use serde::de;
4
5use crate::{AsResult, Error, Parse};
6
7/// The maximum number of pending connections.
8///
9/// This refers to the number of clients that can be waiting to be served. Exceeding this number
10/// results in the client getting an error when attempting to connect. It should only affect servers
11/// under significant load.
12///
13/// Generally set in the 64–2048 range. The default value is 2048. Takes a string value: Either
14/// "default", or an integer N > 0 e.g. "6".
15#[derive(Debug, Clone, PartialEq, Eq, Hash)]
16pub enum Backlog {
17    /// The default number of connections. See struct docs.
18    Default,
19
20    /// A specific number of connections.
21    Manual(usize),
22}
23
24impl Parse for Backlog {
25    fn parse(string: &str) -> AsResult<Self> {
26        match string {
27            "default" => Ok(Backlog::Default),
28            string => match string.parse::<usize>() {
29                Ok(val) => Ok(Backlog::Manual(val)),
30                Err(_) => Err(InvalidValue! {
31                    expected: "an integer > 0",
32                    got: string,
33                }),
34            },
35        }
36    }
37}
38
39impl<'de> de::Deserialize<'de> for Backlog {
40    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
41    where
42        D: de::Deserializer<'de>,
43    {
44        struct BacklogVisitor;
45
46        impl de::Visitor<'_> for BacklogVisitor {
47            type Value = Backlog;
48
49            fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50                let msg = "Either \"default\" or a string containing an integer > 0";
51                f.write_str(msg)
52            }
53
54            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
55            where
56                E: de::Error,
57            {
58                match Backlog::parse(value) {
59                    Ok(backlog) => Ok(backlog),
60                    Err(Error::InvalidValue { expected, got, .. }) => Err(
61                        de::Error::invalid_value(de::Unexpected::Str(&got), &expected),
62                    ),
63                    Err(_) => unreachable!(),
64                }
65            }
66        }
67
68        deserializer.deserialize_string(BacklogVisitor)
69    }
70}