-
Notifications
You must be signed in to change notification settings - Fork 5
/
postgresql.rs
119 lines (102 loc) · 3.19 KB
/
postgresql.rs
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//! # Postgresql addon provider module
//!
//! This module provide helpers and structures to interact with the postgresql
//! addon provider
use std::{
convert::TryFrom,
fmt::{self, Debug, Display, Formatter},
str::FromStr,
};
use hyper::client::connect::Connect;
#[cfg(feature = "logging")]
use log::{debug, log_enabled, Level};
use oauth10a::client::{ClientError, RestClient};
#[cfg(feature = "jsonschemas")]
use schemars::JsonSchema_repr as JsonSchemaRepr;
use serde_repr::{Deserialize_repr as DeserializeRepr, Serialize_repr as SerializeRepr};
use crate::{
v4::addon_provider::{AddonProvider, AddonProviderId},
Client,
};
// -----------------------------------------------------------------------------
// Error enumeration
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error("failed to parse version from '{0}', available versions are 15, 14, 13, 12 and 11")]
ParseVersion(String),
#[error("failed to get information about addon provider '{0}', {1}")]
Get(AddonProviderId, ClientError),
}
// -----------------------------------------------------------------------------
// Version enum
#[cfg_attr(feature = "jsonschemas", derive(JsonSchemaRepr))]
#[derive(SerializeRepr, DeserializeRepr, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Debug)]
#[serde(untagged)]
#[repr(i32)]
pub enum Version {
V15 = 15,
V14 = 14,
V13 = 13,
V12 = 12,
V11 = 11,
}
impl FromStr for Version {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"15" => Self::V15,
"14" => Self::V14,
"13" => Self::V13,
"12" => Self::V12,
"11" => Self::V11,
_ => {
return Err(Error::ParseVersion(s.to_owned()));
}
})
}
}
impl TryFrom<String> for Version {
type Error = Error;
fn try_from(s: String) -> Result<Self, Self::Error> {
Self::from_str(&s)
}
}
#[allow(clippy::from_over_into)]
impl Into<String> for Version {
fn into(self) -> String {
self.to_string()
}
}
impl Display for Version {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Self::V15 => write!(f, "15"),
Self::V14 => write!(f, "14"),
Self::V13 => write!(f, "13"),
Self::V12 => write!(f, "12"),
Self::V11 => write!(f, "11"),
}
}
}
// -----------------------------------------------------------------------------
// Helpers functions
#[cfg_attr(feature = "trace", tracing::instrument)]
/// returns information about the postgresql addon provider
pub async fn get<C>(client: &Client<C>) -> Result<AddonProvider<Version>, Error>
where
C: Connect + Clone + Debug + Send + Sync + 'static,
{
let path = format!(
"{}/v4/addon-providers/{}",
client.endpoint,
AddonProviderId::PostgreSql
);
#[cfg(feature = "logging")]
if log_enabled!(Level::Debug) {
debug!("execute a request to get information about the postgresql addon-provider, path: '{}', name: '{}'", &path, AddonProviderId::PostgreSql);
}
client
.get(&path)
.await
.map_err(|err| Error::Get(AddonProviderId::PostgreSql, err))
}