schema/deployment/source.rs
1use schema_core::{
2 ConnectionSpec, ConnectionUrl, ResolveError, SourceType, resolve_connection_url,
3};
4use serde::{Deserialize, Serialize};
5
6/// The database documents are read from. Today that's always Postgres.
7///
8/// The connection is stored unresolved (a literal or an environment reference)
9/// and resolved at runtime by [`resolve_connection_url`](Source::resolve_connection_url),
10/// so a compiled config carries no secret it wasn't given literally.
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct Source {
13 pub source_type: SourceType,
14 /// How to reach the database. `None` means "rely entirely on
15 /// `DATABASE_URL`", checked when the connection is resolved.
16 #[serde(default, skip_serializing_if = "Option::is_none")]
17 pub connection: Option<ConnectionSpec>,
18}
19
20impl Source {
21 /// Resolve the connection URL now, in the current environment, applying the
22 /// `DATABASE_URL` deployment override. Call this at connect time, not at
23 /// load time, so the value is read where the pipeline runs.
24 pub fn resolve_connection_url(&self) -> Result<ConnectionUrl, ResolveError> {
25 resolve_connection_url(self.connection.as_ref())
26 }
27}