diff --git a/Cargo.toml b/Cargo.toml index 39fa427..2acfa76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,4 @@ edition = "2021" [dependencies] clap = { version = "4.5.23", features = ["derive"] } +replace_with = "0.1.7" diff --git a/src/main.rs b/src/main.rs index 1f7245b..af21266 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,9 @@ use clap::{Parser, Subcommand, ValueEnum}; +use std::cell::LazyCell; use std::env; use std::error::Error; use std::fmt::{Display, Formatter}; +use std::ops::Deref; use std::path::PathBuf; use std::str::FromStr; @@ -63,11 +65,18 @@ enum ServerReference { } impl ServerReference { - //TODO lazy resolve method which gets a provider for configured servers pub fn resolve(self, configured_servers: &[Server]) -> Option { + self.resolve_lazy(&mut LazyCell::new(|| configured_servers)) + } + + pub fn resolve_lazy(self, provider: &mut LazyCell) -> Option + where + S: Deref, + F: FnOnce() -> S + { match self { ServerReference::Resolved(server) => Some(server), - ServerReference::Name(name) => configured_servers + ServerReference::Name(name) => provider .iter() .find(|server| server.ssh_name == name) .cloned(),