use super::{Discover, Discovery, Instance, InstanceCluster};
use crate::client::ClientError;
use crate::component::Endpoint;
use crate::net::address::Address;
use async_broadcast::Receiver;
use faststr::FastStr;
use std::future::Future;
use std::net::AddrParseError;
use std::sync::Arc;
#[derive(Clone)]
pub struct FixedDiscover {
instance_cluster: InstanceCluster,
}
impl FixedDiscover {
pub fn new(instance_cluster: InstanceCluster) -> Self {
Self { instance_cluster }
}
pub fn from_address(address_list: Vec<Address>) -> Self {
let instances = address_list
.into_iter()
.map(|address| {
Arc::new(Instance {
address: address,
weight: 1,
tags: Default::default(),
})
})
.collect();
Self {
instance_cluster: InstanceCluster::Rpc(instances),
}
}
pub fn from_address_str(address_list: Vec<impl AsRef<str>>) -> Result<Self, AddrParseError> {
let mut list = Vec::new();
for ele in address_list {
list.push(ele.as_ref().parse()?);
}
Ok(Self::from_address(list))
}
}
impl Discover for FixedDiscover {
fn discover<'s>(&'s self, endpoint: &'s Endpoint) -> impl Future<Output = Result<Discovery, ClientError>> + Send {
async move {
Ok(Discovery {
key: endpoint.key(),
instance_cluster: self.instance_cluster.clone(),
})
}
}
fn watch(&self, _keys: Option<&[FastStr]>) -> Option<Receiver<Discovery>> {
None
}
}