pdk_core/policy_context/
api.rs1use crate::policy_context::metadata::{Api, EnvironmentContext};
8use crate::policy_context::static_policy_context_cache::StaticPolicyContextCache;
9use classy::extract::context::ConfigureContext;
10use classy::extract::FromContext;
11use classy::hl::Service;
12use std::convert::Infallible;
13
14#[non_exhaustive]
15#[derive(Clone, Debug)]
16pub struct Metadata {
18 pub flex_metadata: FlexMetadata,
20 pub policy_metadata: PolicyMetadata,
22 pub api_metadata: ApiMetadata,
24 pub platform_metadata: PlatformMetadata,
26}
27
28#[non_exhaustive]
29#[derive(Clone, Debug, Default)]
30pub struct FlexMetadata {
32 pub flex_name: String,
34 pub flex_version: String,
36}
37
38#[non_exhaustive]
39#[derive(Clone, Debug, Default)]
40pub struct PolicyMetadata {
42 pub policy_name: String,
44 pub policy_namespace: String,
46 pub filter_name: String,
48}
49
50#[non_exhaustive]
51#[derive(Clone, Debug, Default)]
52pub struct ApiMetadata {
54 pub id: Option<String>,
56 pub name: Option<String>,
58 pub version: Option<String>,
60 pub base_path: Option<String>,
62 pub slas: Option<Vec<ApiSla>>,
64 #[cfg(feature = "experimental")]
65 pub asset: Option<ApiAsset>,
67}
68
69#[non_exhaustive]
70#[derive(Clone, Debug, Default)]
71pub struct PlatformMetadata {
73 pub organization_id: String,
75 pub environment_id: String,
77 pub root_organization_id: String,
79}
80
81#[non_exhaustive]
82#[derive(Clone, Debug, Default)]
83pub struct ApiSla {
85 pub id: String,
87 pub name: String,
89 pub tiers: Vec<Tier>,
91}
92
93#[derive(Clone, Debug, Default)]
94pub struct Tier {
96 pub requests: u64,
98 pub period_in_millis: u64,
100}
101
102#[non_exhaustive]
103#[derive(Clone, Debug, Default)]
104pub struct ApiAsset {
106 pub service: Service,
108}
109
110impl From<&crate::policy_context::metadata::PolicyMetadata> for Metadata {
111 fn from(value: &crate::policy_context::metadata::PolicyMetadata) -> Self {
112 Metadata {
113 flex_metadata: value.into(),
114 policy_metadata: value.into(),
115 api_metadata: value.into(),
116 platform_metadata: value.into(),
117 }
118 }
119}
120
121impl From<&crate::policy_context::metadata::PolicyMetadata> for FlexMetadata {
122 fn from(value: &crate::policy_context::metadata::PolicyMetadata) -> Self {
123 FlexMetadata {
124 flex_name: value.flex_name().to_string(),
125 flex_version: value
126 .anypoint_environment()
127 .and_then(EnvironmentContext::flex_version)
128 .map(str::to_string)
129 .unwrap_or_default(),
131 }
132 }
133}
134
135impl From<&crate::policy_context::metadata::PolicyMetadata> for PolicyMetadata {
136 fn from(value: &crate::policy_context::metadata::PolicyMetadata) -> Self {
137 PolicyMetadata {
138 policy_name: value.policy_id().to_string(),
139 policy_namespace: value.policy_namespace().to_string(),
140 filter_name: value.filter_name().to_string(),
141 }
142 }
143}
144
145impl From<&crate::policy_context::metadata::PolicyMetadata> for ApiMetadata {
146 fn from(value: &crate::policy_context::metadata::PolicyMetadata) -> Self {
147 ApiMetadata {
148 id: value.api_info().map(Api::id).map(str::to_string),
149 name: value.api_info().map(Api::name).map(str::to_string),
150 version: value.api_info().map(Api::version).map(str::to_string),
151 base_path: value
152 .api_info()
153 .and_then(Api::base_path)
154 .map(str::to_string),
155 slas: value
156 .api_tiers()
157 .map(|slas| slas.iter().map(|sla| sla.into()).collect()),
158 #[cfg(feature = "experimental")]
159 asset: value
160 .api_info()
161 .and_then(Api::exchange)
162 .map(|exchange| ApiAsset {
163 service: exchange.service(),
164 }),
165 }
166 }
167}
168
169impl From<&crate::policy_context::metadata::ApiSla> for ApiSla {
170 fn from(value: &crate::policy_context::metadata::ApiSla) -> Self {
171 ApiSla {
172 id: value.id().to_string(),
173 name: value.name().to_string(),
174 tiers: value.tiers().iter().map(|s| s.into()).collect(),
175 }
176 }
177}
178
179impl From<&crate::policy_context::metadata::Tier> for Tier {
180 fn from(value: &crate::policy_context::metadata::Tier) -> Self {
181 Tier {
182 requests: value.requests(),
183 period_in_millis: value.period_in_millis(),
184 }
185 }
186}
187
188impl From<&crate::policy_context::metadata::PolicyMetadata> for PlatformMetadata {
189 fn from(value: &crate::policy_context::metadata::PolicyMetadata) -> Self {
190 value
192 .anypoint_environment()
193 .map(|env| PlatformMetadata {
194 organization_id: env.organization_id().to_string(),
195 environment_id: env.environment_id().to_string(),
196 root_organization_id: env.master_organization_id().to_string(),
197 })
198 .unwrap_or_default()
199 }
200}
201
202impl FromContext<ConfigureContext> for Metadata {
203 type Error = Infallible;
204
205 fn from_context(_context: &ConfigureContext) -> Result<Self, Self::Error> {
206 Ok(Metadata::new())
207 }
208}
209
210impl Metadata {
211 pub fn new() -> Metadata {
212 let context = StaticPolicyContextCache::read_metadata();
213 Metadata::from(context.as_ref())
214 }
215}
216
217impl Default for Metadata {
218 fn default() -> Self {
219 Metadata::new()
220 }
221}