use schemars::JsonSchema;
use serde::Deserialize;
use serde::de::IgnoredAny;
use super::de::{Located, Loose, Map, OneOf, Text, UnknownKeys};
type JsonMap = serde_json::Map<String, serde_json::Value>;
#[derive(Deserialize, JsonSchema)]
#[schemars(title = "DRE sources", deny_unknown_fields)]
pub struct SourcesFile {
#[schemars(required)]
pub sources: Option<Located<Loose<Option<Vec<SourceItem>>>>>,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub version: Option<IgnoredAny>,
}
pub type SourceItem = Located<Loose<Source>>;
pub type TableItem = Located<Loose<Table>>;
type Dbt = Option<IgnoredAny>;
#[derive(Deserialize, JsonSchema)]
#[schemars(rename = "source", deny_unknown_fields)]
pub struct Source {
#[schemars(required, with = "String")]
pub name: Option<Loose<String>>,
pub description: Option<Loose<Text>>,
pub database: Option<Loose<Text>>,
pub schema: Option<Loose<Text>>,
pub profile: Option<Loose<Text>>,
pub quoting: Option<Loose<Quoting>>,
pub tags: Option<Loose<Tags>>,
pub meta: Option<Loose<Meta>>,
pub tables: Option<Loose<Option<Vec<TableItem>>>>,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub loader: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub loaded_at_field: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub loaded_at_query: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub config: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub overrides: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub freshness: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub docs: Dbt,
#[serde(rename = "$unknown", default)]
#[schemars(skip)]
pub unknown: UnknownKeys,
}
#[derive(Deserialize, JsonSchema)]
#[schemars(rename = "table", deny_unknown_fields)]
pub struct Table {
#[schemars(required, with = "String")]
pub name: Option<Loose<String>>,
pub identifier: Option<Loose<Text>>,
pub description: Option<Loose<Text>>,
pub quoting: Option<Loose<Quoting>>,
pub tags: Option<Loose<Tags>>,
pub meta: Option<Loose<Meta>>,
pub columns: Option<Loose<Option<Vec<Loose<Column>>>>>,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub loaded_at_field: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub loaded_at_query: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub tests: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub data_tests: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub freshness: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub external: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub config: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub docs: Dbt,
#[serde(rename = "$unknown", default)]
#[schemars(skip)]
pub unknown: UnknownKeys,
}
#[derive(Deserialize, JsonSchema)]
#[schemars(rename = "column", deny_unknown_fields)]
pub struct Column {
#[schemars(required, with = "String")]
pub name: Option<Loose<String>>,
pub description: Option<Loose<Text>>,
pub data_type: Option<Loose<Text>>,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub meta: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub tags: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub quote: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub tests: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub data_tests: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub constraints: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub config: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub docs: Dbt,
#[serde(default)]
#[schemars(schema_with = "anything")]
pub granularity: Dbt,
#[serde(rename = "$unknown", default)]
#[schemars(skip)]
pub unknown: UnknownKeys,
}
#[derive(Deserialize, JsonSchema)]
#[schemars(rename = "quoting", deny_unknown_fields)]
pub struct Quoting {
#[serde(default)]
#[schemars(with = "bool")]
pub database: Option<Loose<bool>>,
#[serde(default)]
#[schemars(with = "bool")]
pub schema: Option<Loose<bool>>,
#[serde(default)]
#[schemars(with = "bool")]
pub identifier: Option<Loose<bool>>,
#[serde(rename = "$unknown", default)]
#[schemars(skip)]
pub unknown: Map<serde_json::Value>,
}
#[derive(Deserialize, JsonSchema)]
#[serde(transparent)]
#[schemars(rename = "tags")]
pub struct Tags(pub OneOf<String, Vec<String>>);
#[derive(Deserialize, JsonSchema)]
#[serde(transparent)]
#[schemars(rename = "meta")]
pub struct Meta(#[schemars(schema_with = "any_map")] pub JsonMap);
fn anything(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({})
}
fn any_map(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({"type": "object", "additionalProperties": true})
}
impl Source {
pub fn dbt_keys(&self) -> Vec<&'static str> {
[
("loader", &self.loader),
("loaded_at_field", &self.loaded_at_field),
("loaded_at_query", &self.loaded_at_query),
("config", &self.config),
("overrides", &self.overrides),
("freshness", &self.freshness),
("docs", &self.docs),
]
.into_iter()
.filter_map(|(k, v)| v.is_some().then_some(k))
.collect()
}
}
impl Table {
pub fn dbt_keys(&self) -> Vec<&'static str> {
[
("loaded_at_field", &self.loaded_at_field),
("loaded_at_query", &self.loaded_at_query),
("tests", &self.tests),
("data_tests", &self.data_tests),
("freshness", &self.freshness),
("external", &self.external),
("config", &self.config),
("docs", &self.docs),
]
.into_iter()
.filter_map(|(k, v)| v.is_some().then_some(k))
.collect()
}
}
impl Column {
pub fn dbt_keys(&self) -> Vec<&'static str> {
[
("meta", &self.meta),
("tags", &self.tags),
("quote", &self.quote),
("tests", &self.tests),
("data_tests", &self.data_tests),
("constraints", &self.constraints),
("config", &self.config),
("docs", &self.docs),
("granularity", &self.granularity),
]
.into_iter()
.filter_map(|(k, v)| v.is_some().then_some(k))
.collect()
}
}