move repos into monorepo
This commit is contained in:
102
lib/clients/supervisor/src/builder.rs
Normal file
102
lib/clients/supervisor/src/builder.rs
Normal file
@@ -0,0 +1,102 @@
|
||||
//! Builder pattern for WasmSupervisorClient to ensure proper configuration
|
||||
//!
|
||||
//! This module provides a type-safe builder that guarantees a client cannot be
|
||||
//! created without a secret, preventing authentication issues.
|
||||
|
||||
use crate::wasm::WasmSupervisorClient;
|
||||
|
||||
/// Builder for WasmSupervisorClient that enforces secret requirement
|
||||
#[derive(Clone)]
|
||||
pub struct WasmSupervisorClientBuilder {
|
||||
server_url: Option<String>,
|
||||
secret: Option<String>,
|
||||
}
|
||||
|
||||
impl WasmSupervisorClientBuilder {
|
||||
/// Create a new builder
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
server_url: None,
|
||||
secret: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Set the server URL
|
||||
pub fn server_url(mut self, url: impl Into<String>) -> Self {
|
||||
self.server_url = Some(url.into());
|
||||
self
|
||||
}
|
||||
|
||||
/// Set the authentication secret (required)
|
||||
pub fn secret(mut self, secret: impl Into<String>) -> Self {
|
||||
self.secret = Some(secret.into());
|
||||
self
|
||||
}
|
||||
|
||||
/// Build the client
|
||||
///
|
||||
/// Returns Err if server_url or secret is not set
|
||||
pub fn build(self) -> Result<WasmSupervisorClient, String> {
|
||||
let server_url = self.server_url.ok_or("Server URL is required")?;
|
||||
let secret = self.secret.ok_or("Secret is required for authenticated client")?;
|
||||
|
||||
if secret.is_empty() {
|
||||
return Err("Secret cannot be empty".to_string());
|
||||
}
|
||||
|
||||
Ok(WasmSupervisorClient::new(server_url, secret))
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for WasmSupervisorClientBuilder {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_builder_requires_all_fields() {
|
||||
let builder = WasmSupervisorClientBuilder::new();
|
||||
assert!(builder.build().is_err());
|
||||
|
||||
let builder = WasmSupervisorClientBuilder::new()
|
||||
.server_url("http://localhost:3030");
|
||||
assert!(builder.build().is_err());
|
||||
|
||||
let builder = WasmSupervisorClientBuilder::new()
|
||||
.secret("test-secret");
|
||||
assert!(builder.build().is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_builder_success() {
|
||||
let builder = WasmSupervisorClientBuilder::new()
|
||||
.server_url("http://localhost:3030")
|
||||
.secret("test-secret");
|
||||
assert!(builder.build().is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_build_error_messages() {
|
||||
let result = WasmSupervisorClientBuilder::new().build();
|
||||
assert!(result.is_err());
|
||||
assert_eq!(result.unwrap_err(), "Server URL is required");
|
||||
|
||||
let result = WasmSupervisorClientBuilder::new()
|
||||
.server_url("http://localhost:3030")
|
||||
.build();
|
||||
assert!(result.is_err());
|
||||
assert_eq!(result.unwrap_err(), "Secret is required for authenticated client");
|
||||
|
||||
let result = WasmSupervisorClientBuilder::new()
|
||||
.server_url("http://localhost:3030")
|
||||
.secret("")
|
||||
.build();
|
||||
assert!(result.is_err());
|
||||
assert_eq!(result.unwrap_err(), "Secret cannot be empty");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user