From edf7b7dac3ba820ac68efbcbed4c349193237cff Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Mon, 29 Apr 2024 19:57:16 +0200 Subject: [PATCH] Remove the need for async_trait for data source --- .../src/resources/class_data_source.rs | 1 - .../src/resources/class_resource.rs | 7 ++++++ .../src/resources/hugo.rs | 1 - .../src/resources/kitty.rs | 1 - .../src/resources/mod.rs | 1 + terustform/src/datasource.rs | 5 ++-- terustform/src/lib.rs | 1 - terustform/src/provider.rs | 23 +++++++++++++++---- terustform/src/server/handler.rs | 2 +- 9 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 terraform-provider-corsschool/src/resources/class_resource.rs diff --git a/terraform-provider-corsschool/src/resources/class_data_source.rs b/terraform-provider-corsschool/src/resources/class_data_source.rs index 8fbe173..a15198c 100644 --- a/terraform-provider-corsschool/src/resources/class_data_source.rs +++ b/terraform-provider-corsschool/src/resources/class_data_source.rs @@ -20,7 +20,6 @@ struct ClassDataSourceModel { discord_id: StringValue, } -#[terustform::async_trait] impl DataSource for ClassDataSource { type ProviderData = CorsClient; diff --git a/terraform-provider-corsschool/src/resources/class_resource.rs b/terraform-provider-corsschool/src/resources/class_resource.rs new file mode 100644 index 0000000..50b646b --- /dev/null +++ b/terraform-provider-corsschool/src/resources/class_resource.rs @@ -0,0 +1,7 @@ +use terustform::{datasource::DataSource, DResult, Value}; + +use crate::client::CorsClient; + +pub struct ClassResource { + client: CorsClient, +} diff --git a/terraform-provider-corsschool/src/resources/hugo.rs b/terraform-provider-corsschool/src/resources/hugo.rs index f0d642a..5a0f02d 100644 --- a/terraform-provider-corsschool/src/resources/hugo.rs +++ b/terraform-provider-corsschool/src/resources/hugo.rs @@ -17,7 +17,6 @@ struct HugoDataSourceModel { hugo: StringValue, } -#[terustform::async_trait] impl DataSource for HugoDataSource { type ProviderData = CorsClient; diff --git a/terraform-provider-corsschool/src/resources/kitty.rs b/terraform-provider-corsschool/src/resources/kitty.rs index 9629513..423efa6 100644 --- a/terraform-provider-corsschool/src/resources/kitty.rs +++ b/terraform-provider-corsschool/src/resources/kitty.rs @@ -16,7 +16,6 @@ struct ExampleDataSourceModel { id: StringValue, } -#[terustform::async_trait] impl DataSource for ExampleDataSource { type ProviderData = CorsClient; diff --git a/terraform-provider-corsschool/src/resources/mod.rs b/terraform-provider-corsschool/src/resources/mod.rs index c1507f7..b30fe9e 100644 --- a/terraform-provider-corsschool/src/resources/mod.rs +++ b/terraform-provider-corsschool/src/resources/mod.rs @@ -1,3 +1,4 @@ pub mod class_data_source; pub mod hugo; pub mod kitty; +pub mod class_resource; diff --git a/terustform/src/datasource.rs b/terustform/src/datasource.rs index 80f586e..c217a37 100644 --- a/terustform/src/datasource.rs +++ b/terustform/src/datasource.rs @@ -1,3 +1,5 @@ +use std::future::Future; + use crate::{ provider::{MkDataSource, ProviderData}, values::Value, @@ -6,12 +8,11 @@ use crate::{ use super::DResult; -#[crate::async_trait] pub trait DataSource: Send + Sync + 'static { type ProviderData: ProviderData; // todo: probably want some kind of Value+Schema thing like tfsdk? whatever. - async fn read(&self, config: Value) -> DResult; + fn read(&self, config: Value) -> impl Future> + Send + Sync; fn name(provider_name: &str) -> String where diff --git a/terustform/src/lib.rs b/terustform/src/lib.rs index 949d1db..116d476 100644 --- a/terustform/src/lib.rs +++ b/terustform/src/lib.rs @@ -18,7 +18,6 @@ pub use values::*; pub use terustform_macros::Model; -pub use async_trait::async_trait; pub use eyre; // -------- diff --git a/terustform/src/provider.rs b/terustform/src/provider.rs index b4b84c5..1253305 100644 --- a/terustform/src/provider.rs +++ b/terustform/src/provider.rs @@ -1,4 +1,4 @@ -use std::{future::Future, sync::Arc}; +use std::{any::Any, future::Future, marker::PhantomData, pin::Pin, sync::Arc}; use crate::{datasource::DataSource, resource::Resource, DResult, Schema, Value}; @@ -21,15 +21,22 @@ pub struct MkDataSource { } pub(crate) struct StoredDataSource { - pub(crate) ds: Arc>, + pub(crate) object: Arc, + pub(crate) read: fn( + s: &(dyn Any + Send + Sync), + config: Value, + ) -> Pin> + Send + Sync + '_>>, pub(crate) schema: Schema, + p: PhantomData, } impl Clone for StoredDataSource { fn clone(&self) -> Self { Self { - ds: self.ds.clone(), + object: self.object.clone(), + read: self.read, schema: self.schema.clone(), + p: PhantomData, } } } @@ -41,15 +48,21 @@ impl MkDataSource { schema: Ds::schema(), mk: |data| { Ok(StoredDataSource { - ds: Arc::new(Ds::new(data)?), + object: Arc::new(Ds::new(data)?), + read: |s, config| { + Box::pin(async { + let ds = s.downcast_ref::().unwrap(); + ds.read(config).await + }) + }, schema: Ds::schema(), + p: PhantomData, }) }, } } } - pub struct MkResource { pub(crate) name: fn(&str) -> String, pub(crate) schema: Schema, diff --git a/terustform/src/server/handler.rs b/terustform/src/server/handler.rs index 6736630..2893adb 100644 --- a/terustform/src/server/handler.rs +++ b/terustform/src/server/handler.rs @@ -205,7 +205,7 @@ impl ProviderHandler

{ } }; - let state = ds.ds.read(config).await; + let state = (ds.read)(&*ds.object, config).await; let (state, diagnostics) = match state { Ok(s) => ( Some(tfplugin6::DynamicValue {