blaze_common/
parallelism.rs1use 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}