use std::collections::HashMap;
use std::path::Path;
use zhao_core::adapters::dbt::{DbtAdapter, DbtAdapterError, DbtCommandOutput};
use zhao_core::adapters::warehouse::{QueryExecutor, RelationIdentity};
use zhao_core::adapters::{AdapterVocabulary, ToolResolutionError, TransformationToolAdapter};
use zhao_core::model::ParsedProject;
pub enum ResolvedAdapter {
Dbt(DbtAdapter),
}
impl ResolvedAdapter {
pub fn resolve(
project_dir: &Path,
configured_tool: Option<&str>,
) -> Result<ResolvedAdapter, ToolResolutionError> {
let name = zhao_core::adapters::resolve_tool_name(project_dir, configured_tool)?;
match name {
"dbt" => Ok(ResolvedAdapter::Dbt(DbtAdapter)),
other => unreachable!(
"resolve_tool_name only ever returns a registered adapter's own name; \
{other:?} isn't one this module knows how to construct"
),
}
}
pub fn vocabulary(&self) -> &dyn AdapterVocabulary {
match self {
ResolvedAdapter::Dbt(adapter) => adapter.vocabulary(),
}
}
pub fn parse(&self, path: &Path) -> Result<ParsedProject, DbtAdapterError> {
match self {
ResolvedAdapter::Dbt(adapter) => adapter.parse(path),
}
}
pub fn catalog_available(&self, manifest_path: &Path) -> bool {
match self {
ResolvedAdapter::Dbt(adapter) => adapter.catalog_available(manifest_path),
}
}
pub fn parse_for_comparison(
&self,
path: &Path,
use_catalog: bool,
) -> Result<ParsedProject, DbtAdapterError> {
match self {
ResolvedAdapter::Dbt(adapter) => adapter.parse_for_comparison(path, use_catalog),
}
}
pub fn compile(
&self,
project_dir: &Path,
command: &str,
extra_args: &[String],
) -> Result<DbtCommandOutput, DbtAdapterError> {
match self {
ResolvedAdapter::Dbt(adapter) => adapter.compile(project_dir, command, extra_args),
}
}
pub fn deps(
&self,
project_dir: &Path,
command: &str,
extra_args: &[String],
) -> Result<DbtCommandOutput, DbtAdapterError> {
match self {
ResolvedAdapter::Dbt(adapter) => adapter.deps(project_dir, command, extra_args),
}
}
#[allow(clippy::too_many_arguments)]
pub fn show(
&self,
project_dir: &Path,
command: &str,
target: &str,
limit: u32,
output_json: bool,
extra_args: &[String],
) -> Result<DbtCommandOutput, DbtAdapterError> {
match self {
ResolvedAdapter::Dbt(adapter) => {
adapter.show(project_dir, command, target, limit, output_json, extra_args)
}
}
}
pub fn query_executor<'a>(
&self,
project_dir: &'a Path,
command: &'a str,
extra_args: &'a [String],
) -> Box<dyn QueryExecutor + 'a> {
match self {
ResolvedAdapter::Dbt(adapter) => {
adapter.query_executor(project_dir, command, extra_args)
}
}
}
pub fn adapter_type(&self, manifest_path: &Path) -> Result<Option<String>, DbtAdapterError> {
match self {
ResolvedAdapter::Dbt(adapter) => adapter.adapter_type(manifest_path),
}
}
pub fn relation_identities(
&self,
manifest_path: &Path,
) -> Result<HashMap<String, RelationIdentity>, DbtAdapterError> {
match self {
ResolvedAdapter::Dbt(adapter) => adapter.relation_identities(manifest_path),
}
}
}