use std::collections::HashMap;
use crate::data_source::DynamicDataSource;
use crate::diagnostics::Diagnostics;
use crate::function::DynamicFunction;
use crate::raw::RawValue;
use crate::resource::DynamicResource;
use crate::schema::Schema;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
#[async_trait]
pub trait Provider: Send + Sync + 'static {
type Config<'a>: Serialize + Deserialize<'a> + Send;
type MetaState<'a>: Serialize + Deserialize<'a> + Send;
fn schema(&self, diags: &mut Diagnostics) -> Option<Schema>;
async fn validate<'a>(&self, diags: &mut Diagnostics, config: Self::Config<'a>) -> Option<()> {
_ = diags;
_ = config;
Some(())
}
async fn configure<'a>(
&self,
diags: &mut Diagnostics,
terraform_version: String,
config: Self::Config<'a>,
) -> Option<()> {
_ = diags;
_ = terraform_version;
_ = config;
Some(())
}
fn meta_schema(&self, diags: &mut Diagnostics) -> Option<Schema> {
_ = diags;
Some(Schema {
version: 1,
block: Default::default(),
})
}
fn get_resources(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicResource>>> {
_ = diags;
Some(HashMap::new())
}
fn get_data_sources(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicDataSource>>> {
_ = diags;
Some(HashMap::new())
}
fn get_functions(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicFunction>>> {
_ = diags;
Some(HashMap::new())
}
}
#[async_trait]
pub trait DynamicProvider: Send + Sync + 'static {
fn schema(&self, diags: &mut Diagnostics) -> Option<Schema>;
async fn validate(&self, diags: &mut Diagnostics, config: RawValue) -> Option<()> {
_ = diags;
_ = config;
Some(())
}
async fn configure(
&self,
diags: &mut Diagnostics,
terraform_version: String,
config: RawValue,
) -> Option<()> {
_ = diags;
_ = terraform_version;
_ = config;
Some(())
}
fn meta_schema(&self, diags: &mut Diagnostics) -> Option<Schema> {
_ = diags;
Some(Schema {
version: 1,
block: Default::default(),
})
}
fn get_resources(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicResource>>> {
_ = diags;
Some(HashMap::new())
}
fn get_data_sources(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicDataSource>>> {
_ = diags;
Some(HashMap::new())
}
fn get_functions(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicFunction>>> {
_ = diags;
Some(HashMap::new())
}
}
#[async_trait]
impl<T: Provider> DynamicProvider for T {
fn schema(&self, diags: &mut Diagnostics) -> Option<Schema> {
<T as Provider>::schema(self, diags)
}
async fn validate(&self, diags: &mut Diagnostics, config: RawValue) -> Option<()> {
let config = config.deserialize(diags)?;
<T as Provider>::validate(self, diags, config).await
}
async fn configure(
&self,
diags: &mut Diagnostics,
terraform_version: String,
config: RawValue,
) -> Option<()> {
let config = config.deserialize(diags)?;
<T as Provider>::configure(self, diags, terraform_version, config).await
}
fn meta_schema(&self, diags: &mut Diagnostics) -> Option<Schema> {
<T as Provider>::meta_schema(self, diags)
}
fn get_resources(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicResource>>> {
<T as Provider>::get_resources(self, diags)
}
fn get_data_sources(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicDataSource>>> {
<T as Provider>::get_data_sources(self, diags)
}
fn get_functions(
&self,
diags: &mut Diagnostics,
) -> Option<HashMap<String, Box<dyn DynamicFunction>>> {
<T as Provider>::get_functions(self, diags)
}
}
impl<T: Provider + 'static> From<T> for Box<dyn DynamicProvider> {
fn from(value: T) -> Self {
Box::new(value)
}
}