1use serde::{Deserialize, Serialize};
23use typed_builder::TypedBuilder;
24
25use super::StorageConfig;
26use crate::Result;
27
28pub const OSS_ENDPOINT: &str = "oss.endpoint";
30pub const OSS_ACCESS_KEY_ID: &str = "oss.access-key-id";
32pub const OSS_ACCESS_KEY_SECRET: &str = "oss.access-key-secret";
34
35#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, TypedBuilder)]
41pub struct OssConfig {
42 #[builder(default, setter(strip_option, into))]
44 pub endpoint: Option<String>,
45 #[builder(default, setter(strip_option, into))]
47 pub access_key_id: Option<String>,
48 #[builder(default, setter(strip_option, into))]
50 pub access_key_secret: Option<String>,
51}
52
53impl TryFrom<&StorageConfig> for OssConfig {
54 type Error = crate::Error;
55
56 fn try_from(config: &StorageConfig) -> Result<Self> {
57 let props = config.props();
58
59 let mut cfg = OssConfig::default();
60 if let Some(endpoint) = props.get(OSS_ENDPOINT) {
61 cfg.endpoint = Some(endpoint.clone());
62 }
63 if let Some(access_key_id) = props.get(OSS_ACCESS_KEY_ID) {
64 cfg.access_key_id = Some(access_key_id.clone());
65 }
66 if let Some(access_key_secret) = props.get(OSS_ACCESS_KEY_SECRET) {
67 cfg.access_key_secret = Some(access_key_secret.clone());
68 }
69
70 Ok(cfg)
71 }
72}
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77
78 #[test]
79 fn test_oss_config_builder() {
80 let config = OssConfig::builder()
81 .endpoint("https://oss-cn-hangzhou.aliyuncs.com")
82 .access_key_id("my-access-key")
83 .access_key_secret("my-secret-key")
84 .build();
85
86 assert_eq!(
87 config.endpoint.as_deref(),
88 Some("https://oss-cn-hangzhou.aliyuncs.com")
89 );
90 assert_eq!(config.access_key_id.as_deref(), Some("my-access-key"));
91 assert_eq!(config.access_key_secret.as_deref(), Some("my-secret-key"));
92 }
93
94 #[test]
95 fn test_oss_config_from_storage_config() {
96 let storage_config = StorageConfig::new()
97 .with_prop(OSS_ENDPOINT, "https://oss-cn-hangzhou.aliyuncs.com")
98 .with_prop(OSS_ACCESS_KEY_ID, "my-access-key")
99 .with_prop(OSS_ACCESS_KEY_SECRET, "my-secret-key");
100
101 let oss_config = OssConfig::try_from(&storage_config).unwrap();
102
103 assert_eq!(
104 oss_config.endpoint.as_deref(),
105 Some("https://oss-cn-hangzhou.aliyuncs.com")
106 );
107 assert_eq!(oss_config.access_key_id.as_deref(), Some("my-access-key"));
108 assert_eq!(
109 oss_config.access_key_secret.as_deref(),
110 Some("my-secret-key")
111 );
112 }
113
114 #[test]
115 fn test_oss_config_empty() {
116 let storage_config = StorageConfig::new();
117
118 let oss_config = OssConfig::try_from(&storage_config).unwrap();
119
120 assert_eq!(oss_config.endpoint, None);
121 assert_eq!(oss_config.access_key_id, None);
122 assert_eq!(oss_config.access_key_secret, None);
123 }
124}