actix_settings/settings/
num_workers.rs1use std::fmt;
2
3use serde::de;
4
5use crate::{AsResult, Error, Parse};
6
7#[derive(Debug, Clone, PartialEq, Eq, Hash)]
12pub enum NumWorkers {
13 Default,
15
16 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}