use crate::client::WinrmClient;
use crate::config::{WinrmConfig, WinrmCredentials};
use crate::error::WinrmError;
pub struct NeedsCredentials;
pub struct Ready;
pub struct WinrmClientBuilder<S = NeedsCredentials> {
config: WinrmConfig,
credentials: Option<WinrmCredentials>,
_state: std::marker::PhantomData<S>,
}
impl WinrmClientBuilder<NeedsCredentials> {
pub fn new(config: WinrmConfig) -> Self {
Self {
config,
credentials: None,
_state: std::marker::PhantomData,
}
}
pub fn credentials(self, creds: WinrmCredentials) -> WinrmClientBuilder<Ready> {
WinrmClientBuilder {
config: self.config,
credentials: Some(creds),
_state: std::marker::PhantomData,
}
}
}
impl WinrmClientBuilder<Ready> {
pub fn build(self) -> Result<WinrmClient, WinrmError> {
WinrmClient::new(
self.config,
self.credentials
.expect("typestate guarantees credentials are set"),
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn builder_creates_client() {
let client = WinrmClientBuilder::new(WinrmConfig::default())
.credentials(WinrmCredentials::new("admin", "pass", ""))
.build()
.unwrap();
assert_eq!(client.endpoint("test-host"), "http://test-host:5985/wsman");
}
#[test]
fn builder_preserves_custom_config() {
let config = WinrmConfig {
port: 5986,
use_tls: true,
max_envelope_size: 512_000,
..Default::default()
};
let client = WinrmClientBuilder::new(config)
.credentials(WinrmCredentials::new("user", "pw", "DOM"))
.build()
.unwrap();
assert_eq!(client.endpoint("srv"), "https://srv:5986/wsman");
assert_eq!(client.config().max_envelope_size, 512_000);
}
#[test]
fn builder_via_client_static_method() {
let client = WinrmClient::builder(WinrmConfig::default())
.credentials(WinrmCredentials::new("admin", "pass", ""))
.build()
.unwrap();
assert_eq!(client.endpoint("host"), "http://host:5985/wsman");
}
}