contentstack_api_client_rs/client/
config.rs1use std::time::Duration;
2
3pub enum Region {
4 AwsNa,
5 AwsEu,
6 AwsAu,
7 AzureNa,
8 AzureEu,
9 GcpNa,
10 GcpEu,
11}
12
13pub enum ClientType {
14 Delivery,
15 Management,
16}
17
18impl Region {
19 pub fn delivery_base_url(&self) -> &'static str {
20 match &self {
21 Region::AwsNa => "https://cdn.contentstack.io",
22 Region::AwsEu => "https://eu-cdn.contentstack.com",
23 Region::AwsAu => "https://au-cdn.contentstack.com",
24 Region::AzureNa => "https://azure-na-cdn.contentstack.com",
25 Region::AzureEu => "https://azure-eu-cdn.contentstack.com",
26 Region::GcpNa => "https://gcp-na-cdn.contentstack.com",
27 Region::GcpEu => "https://gcp-eu-cdn.contentstack.com",
28 }
29 }
30
31 pub fn management_base_url(&self) -> &'static str {
32 match &self {
33 Region::AwsNa => "https://api.contentstack.io",
34 Region::AwsEu => "https://eu-api.contentstack.com",
35 Region::AwsAu => "https://au-api.contentstack.com",
36 Region::AzureNa => "https://azure-na-api.contentstack.com",
37 Region::AzureEu => "https://azure-eu-api.contentstack.com",
38 Region::GcpNa => "https://gcp-na-api.contentstack.com",
39 Region::GcpEu => "https://gcp-eu-api.contentstack.com",
40 }
41 }
42}
43
44pub struct ClientConfig {
45 pub base_url: String,
46 pub api_key: String,
47 pub management_token: String,
48 pub delivery_token: String,
49 pub environment: Option<String>,
50 pub timeout: Duration,
51 pub max_connections: usize,
52 pub region: Region,
53}
54
55pub struct ClientOptions {
56 pub base_url: Option<String>,
57 pub timeout: Option<Duration>,
58 pub max_connections: Option<usize>,
59 pub region: Option<Region>,
60}
61
62impl ClientConfig {
63 pub fn delivery(
64 api_key: &str,
65 delivery_token: &str,
66 environment: &str,
67 opts: Option<ClientOptions>,
68 ) -> Self {
69 let defaults = ClientOptions::get_defaults(ClientType::Delivery);
70 let defaults = if let Some(config) = opts {
71 ClientOptions {
72 base_url: config.base_url.or(defaults.base_url),
73 timeout: config.timeout.or(defaults.timeout),
74 max_connections: config.max_connections.or(defaults.max_connections),
75 region: config.region.or(defaults.region),
76 }
77 } else {
78 defaults
79 };
80
81 Self {
82 base_url: Option::expect(defaults.base_url, "Base Url not provided"),
83 api_key: api_key.into(),
84 delivery_token: delivery_token.into(),
85 management_token: String::new(),
86 environment: Some(environment.into()),
87 timeout: defaults.timeout.unwrap_or(Duration::from_secs(30)),
88 max_connections: defaults.max_connections.unwrap_or(50),
89 region: Option::expect(defaults.region, "Region not provided"),
90 }
91 }
92}
93
94impl ClientOptions {
95 fn get_defaults(client_type: ClientType) -> ClientOptions {
96 let timeout: Duration = Duration::from_secs(30);
97 let max_connections = 50;
98
99 let base_url = match client_type {
100 ClientType::Delivery => Region::AwsNa.delivery_base_url(),
101 ClientType::Management => Region::AwsNa.management_base_url(),
102 };
103
104 ClientOptions {
105 base_url: Some(base_url.into()),
106 timeout: Some(timeout),
107 max_connections: Some(max_connections),
108 region: Some(Region::AwsNa),
109 }
110 }
111}