seaplane/api/shared/v1/
models.rs

1//! This file contains models that are used across multiple APIs, like `Region`
2//! and `Provider`
3
4use serde::Serialize;
5use strum::{EnumString, EnumVariantNames};
6
7/// A backing cloud provider used to restrict data placement
8#[derive(
9    Clone,
10    Copy,
11    Debug,
12    Hash,
13    Serialize,
14    Eq,
15    PartialEq,
16    PartialOrd,
17    Ord,
18    strum::Display,
19    EnumString,
20    EnumVariantNames,
21)]
22#[allow(clippy::upper_case_acronyms)]
23#[strum(ascii_case_insensitive)]
24#[non_exhaustive]
25pub enum Provider {
26    AWS,
27    Azure,
28    DigitalOcean,
29    Equinix,
30    GCP,
31}
32
33impl_deser_from_str!(Provider);
34
35#[cfg(test)]
36mod test_provider {
37    use super::*;
38
39    #[test]
40    fn provider_case_insensitive() {
41        let provider: Provider = serde_json::from_str("\"aws\"").unwrap();
42        assert_eq!(provider, Provider::AWS);
43        let provider: Provider = serde_json::from_str("\"Aws\"").unwrap();
44        assert_eq!(provider, Provider::AWS);
45        let provider: Provider = serde_json::from_str("\"AWS\"").unwrap();
46        assert_eq!(provider, Provider::AWS);
47    }
48}
49
50/// A regulatory region used to restrict data placement
51#[derive(
52    strum::Display, EnumString, Debug, Serialize, Hash, Eq, PartialEq, PartialOrd, Ord, Copy, Clone,
53)]
54#[allow(clippy::upper_case_acronyms)]
55#[strum(ascii_case_insensitive)]
56#[non_exhaustive]
57pub enum Region {
58    /// Asia
59    XA,
60    /// People's Republic of China
61    XC,
62    /// Europe
63    XE,
64    /// Africa
65    XF,
66    /// North America
67    XN,
68    /// Oceania
69    XO,
70    /// Antarctica
71    XQ,
72    /// South America
73    XS,
74    /// The UK
75    XU,
76}
77
78impl_deser_from_str!(Region);
79
80#[cfg(test)]
81mod test_region {
82    use super::*;
83
84    #[test]
85    fn region_case_insensitive() {
86        let region: Region = serde_json::from_str("\"xn\"").unwrap();
87        assert_eq!(region, Region::XN);
88        let region: Region = serde_json::from_str("\"Xn\"").unwrap();
89        assert_eq!(region, Region::XN);
90        let region: Region = serde_json::from_str("\"XN\"").unwrap();
91        assert_eq!(region, Region::XN);
92    }
93}