clevercloud_sdk/v2/
plan.rs1#[cfg(feature = "logging")]
7use log::{Level, debug, log_enabled};
8use oauth10a::client::{ClientError, RestClient};
9
10use crate::{
11 Client,
12 v2::addon::{Plan, Provider},
13 v4::addon_provider::AddonProviderId,
14};
15
16pub const CONFIG_PROVIDER: &str = "plan_5d8e9596-dd73-4b73-84d9-e165372c5324";
21
22#[derive(thiserror::Error, Debug)]
26pub enum Error {
27 #[error("failed to fetch list of addon providers, {0}")]
28 List(ClientError),
29 #[error("failed to fetch details of addon provider '{0}'")]
30 Get(AddonProviderId),
31 #[error("failed to find plan '{0}' for addon provider '{1}' amongst available options: {2}")]
32 Plan(String, AddonProviderId, String),
33}
34
35#[cfg_attr(feature = "tracing", tracing::instrument)]
39pub async fn list(client: &Client) -> Result<Vec<Provider>, Error> {
41 let path = format!("{}/v2/products/addonproviders", client.endpoint);
42
43 #[cfg(feature = "logging")]
44 if log_enabled!(Level::Debug) {
45 debug!("execute a request to list plans of the addon-provider, path: '{path}'");
46 }
47
48 client.get(&path).await.map_err(Error::List)
49}
50
51#[cfg_attr(feature = "tracing", tracing::instrument)]
52pub async fn find(
60 client: &Client,
61 addon_provider_id: &AddonProviderId,
62 pattern: &str,
63) -> Result<Option<Plan>, Error> {
64 let providers = list(client).await?;
65 let addon_provider_id_str = addon_provider_id.as_str();
66
67 let provider = providers
69 .into_iter()
70 .find(|provider| provider.id == addon_provider_id_str)
71 .ok_or(Error::Get(addon_provider_id.to_owned()))?;
72
73 if provider.plans.is_empty() {
76 return Ok(None);
77 }
78
79 if let Some(plan) = provider.plans.iter().find(|plan| {
81 plan.slug.eq_ignore_ascii_case(pattern)
82 || plan.name.eq_ignore_ascii_case(pattern)
83 || plan.id.eq_ignore_ascii_case(pattern)
84 }) {
85 return Ok(Some(plan.to_owned()));
86 }
87
88 Err(Error::Plan(
90 pattern.to_owned(),
91 addon_provider_id.to_owned(),
92 provider
93 .plans
94 .into_iter()
95 .map(|plan| format!("'{}' ('{}')", plan.name, plan.slug))
96 .collect::<Vec<_>>()
97 .join(", "),
98 ))
99}