use std::fmt::Debug;
use std::hash::Hash;
use after_effects::{InData, OutData, Parameters};
use crate::effect::descriptor::{EffectDescriptor, ExpansionExtent};
use crate::effect::frame_context::{ExpansionContext, FrameDataContext};
use crate::effect::license::LicenseGate;
use crate::effect::params_api::ParamApi;
use crate::graph::RenderGraph;
use crate::params::SetupParams;
pub trait Effect: Sized + Default + Send + Sync + 'static {
type Params: SetupParams + Eq + Hash + Copy + Debug + Send + Sync + 'static;
type FrameData: Copy + Send + Sync + 'static;
type License: LicenseGate;
fn descriptor() -> EffectDescriptor;
fn params(params: &mut Parameters<Self::Params>, in_data: InData, out_data: OutData) -> Result<(), after_effects::Error>;
fn ui(_api: &mut ParamApi<Self::Params>) -> Result<(), after_effects::Error> {
Ok(())
}
fn frame_data(ctx: FrameDataContext<Self::Params>) -> Result<Self::FrameData, after_effects::Error>;
fn expansion(_ctx: ExpansionContext<Self::Params>) -> Result<ExpansionExtent, after_effects::Error> {
Ok(ExpansionExtent::none())
}
fn pipeline(graph: &mut RenderGraph<Self::FrameData>);
}