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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#[cfg(feature = "backend")]
pub mod backends;
#[cfg(feature = "claims")]
pub mod claims;
pub mod database;
#[cfg(feature = "service")]
pub mod deployment;
#[cfg(feature = "service")]
pub mod log;
#[cfg(feature = "models")]
pub mod models;
#[cfg(feature = "service")]
pub mod project;
pub mod resource;
#[cfg(feature = "service")]
pub mod storage_manager;
#[cfg(feature = "tracing")]
pub mod tracing;
#[cfg(feature = "wasm")]
pub mod wasm;
use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[cfg(feature = "service")]
use uuid::Uuid;
#[cfg(feature = "service")]
pub use log::Item as LogItem;
#[cfg(feature = "service")]
pub use log::STATE_MESSAGE;
#[cfg(debug_assertions)]
pub const API_URL_DEFAULT: &str = "http://localhost:8001";
#[cfg(not(debug_assertions))]
pub const API_URL_DEFAULT: &str = "https://api.shuttle.rs";
pub type ApiKey = String;
pub type ApiUrl = String;
pub type Host = String;
#[cfg(feature = "service")]
pub type DeploymentId = Uuid;
#[cfg(feature = "error")]
#[derive(thiserror::Error, Debug)]
pub enum ParseError {
#[error("failed to parse UUID: {0}")]
Uuid(#[from] uuid::Error),
#[error("failed to parse timestamp: {0}")]
Timestamp(#[from] prost_types::TimestampError),
#[error("failed to parse serde: {0}")]
Serde(#[from] serde_json::Error),
}
#[derive(Deserialize, Serialize)]
pub enum DbOutput {
Info(DatabaseReadyInfo),
Local(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseReadyInfo {
engine: String,
role_name: String,
role_password: String,
database_name: String,
port: String,
address_private: String,
address_public: String,
}
impl DatabaseReadyInfo {
pub fn new(
engine: String,
role_name: String,
role_password: String,
database_name: String,
port: String,
address_private: String,
address_public: String,
) -> Self {
Self {
engine,
role_name,
role_password,
database_name,
port,
address_private,
address_public,
}
}
pub fn connection_string_private(&self) -> String {
format!(
"{}://{}:{}@{}:{}/{}",
self.engine,
self.role_name,
self.role_password,
self.address_private,
self.port,
self.database_name
)
}
pub fn connection_string_public(&self) -> String {
format!(
"{}://{}:{}@{}:{}/{}",
self.engine,
self.role_name,
self.role_password,
self.address_public,
self.port,
self.database_name
)
}
}
#[derive(Deserialize, Serialize, Clone)]
pub struct SecretStore {
pub(crate) secrets: BTreeMap<String, String>,
}
impl SecretStore {
pub fn new(secrets: BTreeMap<String, String>) -> Self {
Self { secrets }
}
pub fn get(&self, key: &str) -> Option<String> {
self.secrets.get(key).map(ToOwned::to_owned)
}
}