actix_settings/settings/
num_workers.rs

1use std::fmt;
2
3use serde::de;
4
5use crate::{AsResult, Error, Parse};
6
7/// The number of workers that the server should start.
8///
9/// By default the number of available logical cpu cores is used. Takes a string value: Either
10/// "default", or an integer N > 0 e.g. "6".
11#[derive(Debug, Clone, PartialEq, Eq, Hash)]
12pub enum NumWorkers {
13    /// The default number of workers. See struct docs.
14    Default,
15
16    /// A specific number of workers.
17    Manual(usize),
18}
19
20impl Parse for NumWorkers {
21    fn parse(string: &str) -> AsResult<Self> {
22        match string {
23            "default" => Ok(NumWorkers::Default),
24            string => match string.parse::<usize>() {
25                Ok(val) => Ok(NumWorkers::Manual(val)),
26                Err(_) => Err(InvalidValue! {
27                    expected: "a positive integer",
28                    got: string,
29                }),
30            },
31        }
32    }
33}
34
35impl<'de> de::Deserialize<'de> for NumWorkers {
36    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
37    where
38        D: de::Deserializer<'de>,
39    {
40        struct NumWorkersVisitor;
41
42        impl de::Visitor<'_> for NumWorkersVisitor {
43            type Value = NumWorkers;
44
45            fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46                let msg = "Either \"default\" or a string containing an integer > 0";
47                f.write_str(msg)
48            }
49
50            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
51            where
52                E: de::Error,
53            {
54                match NumWorkers::parse(value) {
55                    Ok(num_workers) => Ok(num_workers),
56                    Err(Error::InvalidValue { expected, got, .. }) => Err(
57                        de::Error::invalid_value(de::Unexpected::Str(&got), &expected),
58                    ),
59                    Err(_) => unreachable!(),
60                }
61            }
62        }
63
64        deserializer.deserialize_string(NumWorkersVisitor)
65    }
66}