powerplatform_dataverse_client/auth/
config.rs1use serde::{Deserialize, Serialize};
2
3use crate::auth::connectionstring::parse_connection_string_auth_config;
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
7#[serde(tag = "method")]
8pub enum AuthConfig {
9 #[serde(rename = "ClientCredentials", alias = "ClientSecret")]
11 ClientCredentials {
12 #[serde(rename = "clientId")]
14 client_id: String,
15 #[serde(rename = "clientSecret")]
17 client_secret: String,
18 #[serde(rename = "tenantId")]
20 tenant_id: String,
21 #[serde(rename = "dataverseUrl")]
23 dataverse_url: String,
24 #[serde(default)]
26 #[serde(rename = "tokenCacheStorePath")]
27 token_cache_store_path: Option<String>,
28 },
29 #[serde(rename = "DeviceCode", alias = "AuthorizationCode", alias = "OAuth")]
31 DeviceCode {
32 #[serde(rename = "clientId")]
34 client_id: String,
35 #[serde(rename = "dataverseUrl")]
37 dataverse_url: String,
38 #[serde(default)]
40 #[serde(rename = "tenantId")]
41 tenant_id: String,
42 #[serde(default)]
44 #[serde(rename = "tokenCacheStorePath")]
45 token_cache_store_path: Option<String>,
46 },
47}
48
49impl AuthConfig {
50 pub fn from_connection_string(connection_string: &str) -> Result<Self, String> {
52 parse_connection_string_auth_config(connection_string)
53 }
54
55 pub(crate) fn dataverse_url(&self) -> &str {
56 match self {
57 AuthConfig::ClientCredentials { dataverse_url, .. } => dataverse_url.trim_end_matches('/'),
58 AuthConfig::DeviceCode { dataverse_url, .. } => dataverse_url,
59 }
60 }
61
62 pub(crate) fn scope(&self) -> Option<String> {
63 match self {
64 AuthConfig::ClientCredentials { dataverse_url, .. } => {
65 Some(format!("{}/.default", dataverse_url.trim_end_matches('/')))
66 }
67 AuthConfig::DeviceCode { .. } => None,
68 }
69 }
70}