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