Skip to main content

powerplatform_dataverse_client/auth/
config.rs

1use serde::{Deserialize, Serialize};
2
3use crate::auth::connectionstring::parse_connection_string_auth_config;
4
5/// Public authentication configuration for acquiring Dataverse access tokens.
6#[derive(Clone, Debug, Serialize, Deserialize)]
7#[serde(tag = "method")]
8pub enum AuthConfig {
9    /// Azure AD client credentials (app-only) flow configuration.
10    #[serde(rename = "ClientCredentials", alias = "ClientSecret")]
11    ClientCredentials {
12        /// Azure AD client ID.
13        #[serde(rename = "clientId")]
14        client_id: String,
15        /// Azure AD client secret.
16        #[serde(rename = "clientSecret")]
17        client_secret: String,
18        /// Azure AD tenant ID.
19        #[serde(rename = "tenantId")]
20        tenant_id: String,
21        /// Dataverse environment URL.
22        #[serde(rename = "dataverseUrl")]
23        dataverse_url: String,
24        /// Optional token cache path from the original connection string.
25        #[serde(default)]
26        #[serde(rename = "tokenCacheStorePath")]
27        token_cache_store_path: Option<String>,
28    },
29    /// Device code flow configuration.
30    #[serde(rename = "DeviceCode", alias = "AuthorizationCode", alias = "OAuth")]
31    DeviceCode {
32        /// Azure AD client ID.
33        #[serde(rename = "clientId")]
34        client_id: String,
35        /// Dataverse environment URL.
36        #[serde(rename = "dataverseUrl")]
37        dataverse_url: String,
38        /// Azure AD tenant ID.
39        #[serde(default)]
40        #[serde(rename = "tenantId")]
41        tenant_id: String,
42        /// Optional token cache path from the original connection string.
43        #[serde(default)]
44        #[serde(rename = "tokenCacheStorePath")]
45        token_cache_store_path: Option<String>,
46    },
47}
48
49impl AuthConfig {
50    /// Parse an `AuthConfig` from a Dataverse-style connection string.
51    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}