use crate::client::{Client, ClientConfig};
use crate::discovery::{try_adopt_or_spawn, AdoptOrSpawn};
use crate::host_identity::HostExpectation;
#[allow(clippy::large_enum_variant)]
pub enum Attached<T> {
Daemon(Client),
Fallback(T),
Unknown(std::io::Error),
}
pub fn attach_or_fallback<T>(
config: &ClientConfig,
expect: Option<&HostExpectation>,
fallback: impl FnOnce() -> T,
) -> Attached<T> {
let suite = match config.resolve_suite() {
Ok(suite) => suite,
Err(_) => return Attached::Fallback(fallback()),
};
match try_adopt_or_spawn(&suite, config.service()) {
Err(e) => Attached::Unknown(e),
Ok(AdoptOrSpawn::Spawn) => Attached::Fallback(fallback()),
Ok(AdoptOrSpawn::Adopt(_)) => {
let connected = match expect {
Some(expect) => Client::connect_expecting(config, expect).ok(),
None => Client::connect_config(config).ok(),
};
match connected {
Some(client) => Attached::Daemon(client),
None => Attached::Fallback(fallback()),
}
}
}
}