clevercloud_sdk/v4/addon_provider/
mysql.rs

1//! # MySql addon provider module
2//!
3//! This module provides helpers and structures to interact with the mysql
4//! addon provider
5
6use std::{
7    convert::TryFrom,
8    fmt::{self, Debug, Display, Formatter},
9    str::FromStr,
10};
11
12#[cfg(feature = "logging")]
13use log::{Level, debug, log_enabled};
14use oauth10a::client::{ClientError, RestClient};
15#[cfg(feature = "jsonschemas")]
16use schemars::JsonSchema_repr as JsonSchemaRepr;
17use serde_repr::{Deserialize_repr as DeserializeRepr, Serialize_repr as SerializeRepr};
18
19use crate::{
20    Client,
21    v4::addon_provider::{AddonProvider, AddonProviderId},
22};
23
24// -----------------------------------------------------------------------------
25// Error enumeration
26
27#[derive(thiserror::Error, Debug)]
28pub enum Error {
29    #[error("failed to parse version from '{0}', available versions are 5.7 and 8.0")]
30    ParseVersion(String),
31    #[error("failed to get information about addon provider '{0}', {1}")]
32    Get(AddonProviderId, ClientError),
33}
34
35// -----------------------------------------------------------------------------
36// Version enum
37
38#[cfg_attr(feature = "jsonschemas", derive(JsonSchemaRepr))]
39#[derive(SerializeRepr, DeserializeRepr, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Debug)]
40#[serde(untagged)]
41#[repr(i32)]
42pub enum Version {
43    V5dot7 = 57,
44    V8dot0 = 80,
45    V8dot4 = 84,
46}
47
48impl FromStr for Version {
49    type Err = Error;
50
51    fn from_str(s: &str) -> Result<Self, Self::Err> {
52        Ok(match s {
53            "5.7" => Self::V5dot7,
54            "8.0" => Self::V8dot0,
55            "8.4" => Self::V8dot4,
56            _ => {
57                return Err(Error::ParseVersion(s.to_owned()));
58            }
59        })
60    }
61}
62
63impl TryFrom<String> for Version {
64    type Error = Error;
65
66    fn try_from(s: String) -> Result<Self, Self::Error> {
67        Self::from_str(&s)
68    }
69}
70
71#[allow(clippy::from_over_into)]
72impl Into<String> for Version {
73    fn into(self) -> String {
74        self.to_string()
75    }
76}
77
78impl Display for Version {
79    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
80        match self {
81            Self::V5dot7 => write!(f, "5.7"),
82            Self::V8dot0 => write!(f, "8.0"),
83            Self::V8dot4 => write!(f, "8.4"),
84        }
85    }
86}
87
88// -----------------------------------------------------------------------------
89// Helpers functions
90
91/// returns information about the mysql addon provider
92#[cfg_attr(feature = "tracing", tracing::instrument)]
93pub async fn get(client: &Client) -> Result<AddonProvider<Version>, Error> {
94    let path = format!(
95        "{}/v4/addon-providers/{}",
96        client.endpoint,
97        AddonProviderId::MySql
98    );
99
100    #[cfg(feature = "logging")]
101    if log_enabled!(Level::Debug) {
102        debug!(
103            "execute a request to get information about the mysql addon-provider, path: '{}', name: '{}'",
104            &path,
105            AddonProviderId::MySql
106        );
107    }
108
109    client
110        .get(&path)
111        .await
112        .map_err(|err| Error::Get(AddonProviderId::MySql, err))
113}