blaze_common/
parallelism.rs

1use std::{fmt::Display, num::NonZeroUsize, str::FromStr};
2
3use serde::{de::Visitor, Deserialize, Serialize};
4
5use crate::error::{Error, Result};
6
7#[derive(Debug, Default, Copy, Clone)]
8pub enum Parallelism {
9    #[default]
10    None,
11    Count(NonZeroUsize),
12    All,
13    Infinite,
14}
15
16impl Serialize for Parallelism {
17    fn serialize<S>(&self, serializer: S) -> std::prelude::v1::Result<S::Ok, S::Error>
18    where
19        S: serde::Serializer,
20    {
21        match self {
22            Self::Count(i) => i.serialize(serializer),
23            other => serializer.serialize_str(&other.to_string()),
24        }
25    }
26}
27
28impl<'de> Deserialize<'de> for Parallelism {
29    fn deserialize<D>(deserializer: D) -> std::prelude::v1::Result<Self, D::Error>
30    where
31        D: serde::Deserializer<'de>,
32    {
33        struct ParallelismVisitor;
34
35        impl<'de> Visitor<'de> for ParallelismVisitor {
36            type Value = Parallelism;
37
38            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
39                formatter.write_str("either a number or a string")
40            }
41
42            fn visit_str<E>(self, v: &str) -> std::prelude::v1::Result<Self::Value, E>
43            where
44                E: serde::de::Error,
45            {
46                Parallelism::from_str(v).map_err(serde::de::Error::custom)
47            }
48
49            fn visit_u64<E>(self, v: u64) -> std::prelude::v1::Result<Self::Value, E>
50            where
51                E: serde::de::Error,
52            {
53                Ok(Parallelism::Count(
54                    usize::try_from(v)
55                        .and_then(NonZeroUsize::try_from)
56                        .map_err(serde::de::Error::custom)?,
57                ))
58            }
59        }
60
61        deserializer.deserialize_any(ParallelismVisitor)
62    }
63}
64
65impl FromStr for Parallelism {
66    type Err = Error;
67
68    fn from_str(s: &str) -> Result<Self> {
69        match s.to_ascii_lowercase().as_str() {
70            "all" => Ok(Self::All),
71            "none" => Ok(Self::None),
72            "infinite" => Ok(Self::Infinite),
73            number => Ok(Self::Count(NonZeroUsize::from_str(number)?)),
74        }
75    }
76}
77
78impl Display for Parallelism {
79    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
80        match self {
81            Self::All => f.write_str("All"),
82            Self::Infinite => f.write_str("Infinite"),
83            Self::Count(i) => f.write_str(&i.to_string()),
84            Self::None => f.write_str("None"),
85        }
86    }
87}