]> git.proxmox.com Git - cargo.git/blob - vendor/concolor/src/color/choice.rs
New upstream version 0.63.1
[cargo.git] / vendor / concolor / src / color / choice.rs
1 use std::sync::atomic::{AtomicUsize, Ordering};
2
3 #[derive(Debug)]
4 pub(crate) struct AtomicChoice(AtomicUsize);
5
6 impl AtomicChoice {
7 pub(crate) const fn new() -> Self {
8 Self(AtomicUsize::new(Self::from_choice(
9 crate::ColorChoice::Auto,
10 )))
11 }
12
13 pub(crate) fn get(&self) -> crate::ColorChoice {
14 let choice = self.0.load(Ordering::SeqCst);
15 Self::to_choice(choice).unwrap()
16 }
17
18 #[cfg(feature = "api_unstable")]
19 pub(crate) fn set(&self, choice: crate::ColorChoice) {
20 let choice = Self::from_choice(choice);
21 self.0.store(choice, Ordering::SeqCst);
22 }
23
24 const fn from_choice(choice: crate::ColorChoice) -> usize {
25 match choice {
26 crate::ColorChoice::Auto => 0,
27 crate::ColorChoice::AlwaysAnsi => 1,
28 crate::ColorChoice::Always => 2,
29 crate::ColorChoice::Never => 3,
30 }
31 }
32
33 const fn to_choice(choice: usize) -> Option<crate::ColorChoice> {
34 match choice {
35 0 => Some(crate::ColorChoice::Auto),
36 1 => Some(crate::ColorChoice::AlwaysAnsi),
37 2 => Some(crate::ColorChoice::Always),
38 3 => Some(crate::ColorChoice::Never),
39 _ => None,
40 }
41 }
42 }
43
44 impl Default for AtomicChoice {
45 fn default() -> Self {
46 Self::new()
47 }
48 }
49
50 #[cfg(test)]
51 mod test {
52 use super::*;
53
54 #[test]
55 fn choice_serialization() {
56 let expected = vec![
57 crate::ColorChoice::Auto,
58 crate::ColorChoice::AlwaysAnsi,
59 crate::ColorChoice::Always,
60 crate::ColorChoice::Never,
61 ];
62 let values: Vec<_> = expected
63 .iter()
64 .cloned()
65 .map(AtomicChoice::from_choice)
66 .collect();
67 let actual: Vec<_> = values
68 .iter()
69 .cloned()
70 .map(AtomicChoice::to_choice)
71 .flatten()
72 .collect();
73 assert_eq!(expected, actual);
74 }
75 }