1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
macro_rules! credential_builder_base {
    ($name:ident) => {
        impl $name {
            pub fn with_client_id(&mut self, client_id: impl TryInto<uuid::Uuid>) -> &mut Self {
                self.credential.app_config.with_client_id(client_id);
                self
            }

            /// Convenience method. Same as calling [with_authority(Authority::TenantId("tenant_id"))]
            pub fn with_tenant(&mut self, tenant_id: impl AsRef<str>) -> &mut Self {
                self.credential.app_config.with_tenant(tenant_id);
                self
            }

            pub fn with_authority(
                &mut self,
                authority: impl Into<crate::identity::Authority>,
            ) -> &mut Self {
                self.credential.app_config.with_authority(authority.into());
                self
            }

            pub fn with_azure_cloud_instance(
                &mut self,
                azure_cloud_instance: crate::identity::AzureCloudInstance,
            ) -> &mut Self {
                self.credential
                    .app_config
                    .with_azure_cloud_instance(azure_cloud_instance);
                self
            }

            /// Extends the query parameters of both the default query params and user defined params.
            /// Does not overwrite default params.
            pub fn with_extra_query_param(&mut self, query_param: (String, String)) -> &mut Self {
                self.credential
                    .app_config
                    .with_extra_query_param(query_param);
                self
            }

            /// Extends the query parameters of both the default query params and user defined params.
            /// Does not overwrite default params.
            pub fn with_extra_query_parameters(
                &mut self,
                query_parameters: HashMap<String, String>,
            ) -> &mut Self {
                self.credential
                    .app_config
                    .with_extra_query_parameters(query_parameters);
                self
            }

            /// Extends the header parameters of both the default header params and user defined params.
            /// Does not overwrite default params.
            pub fn with_extra_header_param<K: Into<HeaderName>, V: Into<HeaderValue>>(
                &mut self,
                header_name: K,
                header_value: V,
            ) -> &mut Self {
                self.credential
                    .app_config
                    .with_extra_header_param(header_name, header_value);
                self
            }

            /// Extends the header parameters of both the default header params and user defined params.
            /// Does not overwrite default params.
            pub fn with_extra_header_parameters(
                &mut self,
                header_parameters: HeaderMap,
            ) -> &mut Self {
                self.credential
                    .app_config
                    .with_extra_header_parameters(header_parameters);
                self
            }

            pub fn with_scope<T: ToString, I: IntoIterator<Item = T>>(
                &mut self,
                scope: I,
            ) -> &mut Self {
                self.credential.app_config.with_scope(scope);
                self
            }
        }
    };
}

macro_rules! credential_builder {
    ($name:ident, $client:ty) => {
        credential_builder_base!($name);

        impl $name {
            pub fn build(&self) -> $client {
                <$client>::new(self.credential.clone())
            }
        }
    };
}