pub mod http;
pub mod local;
use crate::core::{ChoreographyLocation, HCons, LocationSet};
use std::collections::HashMap;
use std::marker::PhantomData;
#[derive(Clone)]
pub struct TransportConfig<'a, Target: ChoreographyLocation, TargetInfo, L: LocationSet, Info> {
pub info: HashMap<&'static str, Info>,
pub target_info: (Target, TargetInfo),
location_set: PhantomData<L>,
lifetime: PhantomData<&'a ()>,
}
pub struct TransportConfigBuilder<
'a,
Target: ChoreographyLocation,
TargetInfo,
L: LocationSet,
Info,
> {
target: (Target, TargetInfo),
location_set: PhantomData<L>,
info: HashMap<&'static str, Info>,
lifetime: PhantomData<&'a ()>,
}
impl<'a, Target: ChoreographyLocation, TargetInfo, Info>
TransportConfigBuilder<'a, Target, TargetInfo, LocationSet!(Target), Info>
{
pub fn for_target(target: Target, info: TargetInfo) -> Self {
Self {
target: (target, info),
location_set: PhantomData,
info: HashMap::new(),
lifetime: PhantomData,
}
}
}
impl<'a, Target: ChoreographyLocation, TargetInfo, L: LocationSet, Info>
TransportConfigBuilder<'a, Target, TargetInfo, L, Info>
{
pub fn with<'b, NewLocation: ChoreographyLocation>(
self,
location: NewLocation,
info: Info,
) -> TransportConfigBuilder<'b, Target, TargetInfo, HCons<NewLocation, L>, Info> {
_ = location;
let mut new_info = self.info;
new_info.insert(NewLocation::name(), info);
TransportConfigBuilder {
target: self.target,
location_set: PhantomData,
info: new_info,
lifetime: PhantomData,
}
}
pub fn build<'b>(self) -> TransportConfig<'b, Target, TargetInfo, L, Info> {
TransportConfig {
info: self.info,
target_info: self.target,
location_set: PhantomData,
lifetime: PhantomData,
}
}
}