show proper message when server reference can't be resolved
This commit is contained in:
parent
e203ed1dbb
commit
0f52824970
66
src/main.rs
66
src/main.rs
@ -65,23 +65,54 @@ enum ServerReference {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ServerReference {
|
impl ServerReference {
|
||||||
pub fn resolve(self, configured_servers: &[Server]) -> Option<Server> {
|
pub fn get_name(&self) -> &str {
|
||||||
self.resolve_lazy(&mut LazyCell::new(|| configured_servers))
|
match self {
|
||||||
|
ServerReference::Resolved(server) => &server.ssh_name,
|
||||||
|
ServerReference::Name(name) => name,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn resolve(self, configured_servers: &[Server]) -> Option<Server> {
|
||||||
|
match self {
|
||||||
|
ServerReference::Resolved(server) => Some(server),
|
||||||
|
ServerReference::Name(name) => Self::resolve_server_name(&name, configured_servers),
|
||||||
|
}
|
||||||
|
}
|
||||||
pub fn resolve_lazy<S, F>(self, provider: &mut LazyCell<S, F>) -> Option<Server>
|
pub fn resolve_lazy<S, F>(self, provider: &mut LazyCell<S, F>) -> Option<Server>
|
||||||
where
|
where
|
||||||
S: Deref<Target = [Server]>,
|
S: Deref<Target = [Server]>,
|
||||||
F: FnOnce() -> S
|
F: FnOnce() -> S,
|
||||||
{
|
{
|
||||||
match self {
|
match self {
|
||||||
ServerReference::Resolved(server) => Some(server),
|
ServerReference::Resolved(server) => Some(server),
|
||||||
ServerReference::Name(name) => provider
|
ServerReference::Name(name) => Self::resolve_server_name(&name, provider),
|
||||||
.iter()
|
|
||||||
.find(|server| server.ssh_name == name)
|
|
||||||
.cloned(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn try_resolve_lazy<S, F, E>(
|
||||||
|
self,
|
||||||
|
provider: &mut LazyCell<Result<S, E>, F>,
|
||||||
|
) -> Result<Option<Server>, E>
|
||||||
|
where
|
||||||
|
S: Deref<Target = [Server]>,
|
||||||
|
F: FnOnce() -> Result<S, E>,
|
||||||
|
E: Clone,
|
||||||
|
{
|
||||||
|
match self {
|
||||||
|
ServerReference::Resolved(server) => Ok(Some(server)),
|
||||||
|
ServerReference::Name(name) => provider
|
||||||
|
.as_ref()
|
||||||
|
.map_err(|e| e.clone())
|
||||||
|
.map(|servers| Self::resolve_server_name(&name, servers)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resolve_server_name(name: &str, servers: &[Server]) -> Option<Server> {
|
||||||
|
servers
|
||||||
|
.iter()
|
||||||
|
.find(|server| server.ssh_name == name)
|
||||||
|
.cloned()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FromStr for ServerReference {
|
impl FromStr for ServerReference {
|
||||||
@ -150,8 +181,25 @@ fn main() -> Result<(), String> {
|
|||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
dbg!(&args);
|
dbg!(&args);
|
||||||
|
|
||||||
let configured_servers = parse_server_configuration_from_env()?;
|
let mut configured_servers = LazyCell::new(parse_server_configuration_from_env);
|
||||||
dbg!(&configured_servers);
|
let servers = args
|
||||||
|
.servers
|
||||||
|
.iter()
|
||||||
|
.map(|server_reference| {
|
||||||
|
let server_name = server_reference.get_name();
|
||||||
|
server_reference
|
||||||
|
.clone()
|
||||||
|
.try_resolve_lazy(&mut configured_servers)
|
||||||
|
.map_err(|msg| format!("Can't resolve server directory for '{server_name}': {msg}"))
|
||||||
|
.and_then(|opt_server| {
|
||||||
|
opt_server.ok_or(format!(
|
||||||
|
"no server directory has been configured for server '{server_name}'"
|
||||||
|
))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
|
||||||
|
dbg!(&servers);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user