use std::{fmt::Debug, hash::Hash, marker::PhantomData};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
pub trait ParamsKeys {
type WorkspaceParamsKMaybe: KeyMaybe;
type ProfileParamsKMaybe: KeyMaybe;
type FlowParamsKMaybe: KeyMaybe;
}
#[derive(Debug)]
pub struct ParamsKeysImpl<WorkspaceParamsKMaybe, ProfileParamsKMaybe, FlowParamsKMaybe> {
marker: PhantomData<(WorkspaceParamsKMaybe, ProfileParamsKMaybe, FlowParamsKMaybe)>,
}
impl<WorkspaceParamsKMaybe, ProfileParamsKMaybe, FlowParamsKMaybe>
ParamsKeysImpl<WorkspaceParamsKMaybe, ProfileParamsKMaybe, FlowParamsKMaybe>
{
pub fn new() -> Self {
Self::default()
}
}
impl<WorkspaceParamsKMaybe, ProfileParamsKMaybe, FlowParamsKMaybe> Default
for ParamsKeysImpl<WorkspaceParamsKMaybe, ProfileParamsKMaybe, FlowParamsKMaybe>
{
fn default() -> Self {
Self {
marker: PhantomData,
}
}
}
impl<WorkspaceParamsKMaybe, ProfileParamsKMaybe, FlowParamsKMaybe> ParamsKeys
for ParamsKeysImpl<WorkspaceParamsKMaybe, ProfileParamsKMaybe, FlowParamsKMaybe>
where
WorkspaceParamsKMaybe: KeyMaybe,
ProfileParamsKMaybe: KeyMaybe,
FlowParamsKMaybe: KeyMaybe,
{
type FlowParamsKMaybe = FlowParamsKMaybe;
type ProfileParamsKMaybe = ProfileParamsKMaybe;
type WorkspaceParamsKMaybe = WorkspaceParamsKMaybe;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub struct KeyUnknown;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub struct KeyKnown<K>(PhantomData<K>);
pub trait KeyMaybe: Debug {
type Key: Clone + Debug + Eq + Hash + DeserializeOwned + Serialize + Send + Sync + 'static;
}
impl KeyMaybe for KeyUnknown {
type Key = ();
}
impl<K> KeyMaybe for KeyKnown<K>
where
K: Clone + Debug + Eq + Hash + DeserializeOwned + Serialize + Send + Sync + 'static,
{
type Key = K;
}