use std::collections::BTreeMap;
use std::net::SocketAddr;
use std::path::PathBuf;
use async_trait::async_trait;
use serde::{de::DeserializeOwned, Serialize};
use shuttle_common::constants::STORAGE_DIRNAME;
pub use shuttle_common::{
models::{
deployment::{DeploymentMetadata, Environment},
resource,
},
secrets::{Secret, SecretStore},
ContainerRequest, ContainerResponse, DatabaseInfo, DatabaseResource, DbInput,
};
pub use crate::error::{CustomError, Error};
pub mod error;
#[async_trait]
pub trait ResourceInputBuilder: Default {
type Input: Serialize + DeserializeOwned;
type Output: Serialize + DeserializeOwned;
async fn build(self, factory: &ResourceFactory) -> Result<Self::Input, crate::Error>;
}
pub struct ResourceFactory {
project_name: String,
secrets: BTreeMap<String, Secret<String>>,
env: Environment,
}
impl ResourceFactory {
pub fn new(
project_name: String,
secrets: BTreeMap<String, Secret<String>>,
env: Environment,
) -> Self {
Self {
project_name,
secrets,
env,
}
}
pub fn get_secrets(&self) -> BTreeMap<String, Secret<String>> {
self.secrets.clone()
}
pub fn get_metadata(&self) -> DeploymentMetadata {
DeploymentMetadata {
env: self.env,
project_name: self.project_name.to_string(),
storage_path: PathBuf::from(STORAGE_DIRNAME),
}
}
}
#[async_trait]
pub trait IntoResource<R>: Serialize + DeserializeOwned {
async fn into_resource(self) -> Result<R, crate::Error>;
}
#[async_trait]
impl<R: Serialize + DeserializeOwned + Send> IntoResource<R> for R {
async fn into_resource(self) -> Result<R, crate::Error> {
Ok(self)
}
}
#[async_trait]
pub trait Service: Send {
async fn bind(mut self, addr: SocketAddr) -> Result<(), error::Error>;
}