Skip to content

Commit a1c1300

Browse files
committed
πŸ—οΈ Provider Configuration Foundation
🎯 Foundation Features: - ProviderType enum (Local, OpenRouter) - ProviderConfig with validation status tracking - Settings extension with provider management - SettingsAction enum for provider operations - Secure API key masking and validation πŸ“‹ Data Structures: - ValidationStatus: Unchecked β†’ Checking β†’ Valid/Invalid - ProviderField: LocalEndpoint, OpenRouterApiKey - Provider navigation and field focus management - Clean separation between LOCAL and OPENROUTER configs πŸ”’ Security Features: - API key masking (show first 10 + last 3 chars) - Input validation for URLs and keys - Required field validation - Extensible validation architecture πŸ§ͺ Testing: - 10/10 tests passing βœ… - Provider config creation & updates βœ… - API key masking βœ… - Validation rules βœ… - Navigation & field management βœ… - Demo example working βœ… πŸš€ Ready for UI Integration: - Foundation supports async validation - Clean action-based architecture - Extensible for future providers - Security-first design Closes #29
1 parent 02e5e2f commit a1c1300

File tree

2 files changed

+437
-14
lines changed

2 files changed

+437
-14
lines changed

β€Žexamples/issue_29_demo.rsβ€Ž

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
//! Issue #29 Demo: Provider Configuration Foundation
2+
//!
3+
//! Demonstrates the new provider configuration system for LOCAL and OPENROUTER providers.
4+
5+
use agentic::{
6+
settings::{
7+
Settings, SettingsAction, ProviderConfig, ProviderField,
8+
ValidationStatus
9+
},
10+
};
11+
12+
fn main() {
13+
println!("πŸ—οΈ Issue #29 Demo: Provider Configuration Foundation");
14+
println!("==================================================");
15+
16+
println!("\nβœ… Provider Configuration Foundation Features:");
17+
18+
// 1. Create settings with provider configurations
19+
println!("1. Creating settings with default provider configurations...");
20+
let mut settings = Settings::new();
21+
22+
println!(" Local provider configured: {}", settings.local_provider.is_configured());
23+
println!(" OpenRouter provider configured: {}", settings.openrouter_provider.is_configured());
24+
println!(" Selected provider: {}", settings.get_provider_name(settings.selected_provider_index));
25+
26+
// 2. Test provider type creation
27+
println!("\n2. Testing provider configuration types...");
28+
let local_config = ProviderConfig::new_local();
29+
let openrouter_config = ProviderConfig::new_openrouter();
30+
31+
println!(" Local default endpoint: {:?}", local_config.endpoint_url);
32+
println!(" Local API key: {:?}", local_config.api_key);
33+
println!(" OpenRouter endpoint: {:?}", openrouter_config.endpoint_url);
34+
println!(" OpenRouter API key: {:?}", openrouter_config.api_key);
35+
36+
// 3. Test validation status system
37+
println!("\n3. Testing validation status system...");
38+
for status in [
39+
ValidationStatus::Unchecked,
40+
ValidationStatus::Checking,
41+
ValidationStatus::Valid,
42+
ValidationStatus::Invalid
43+
] {
44+
println!(" Status: {:?} β†’ Icon: {}", status, Settings::get_validation_status_icon(&status));
45+
}
46+
47+
// 4. Test field updates
48+
println!("\n4. Testing field update actions...");
49+
settings.handle_action(SettingsAction::UpdateField(
50+
ProviderField::LocalEndpoint,
51+
"http://localhost:8080".to_string()
52+
));
53+
println!(" Updated local endpoint: {:?}", settings.local_provider.endpoint_url);
54+
55+
settings.handle_action(SettingsAction::UpdateField(
56+
ProviderField::OpenRouterApiKey,
57+
"sk-or-demo123456789012345".to_string()
58+
));
59+
println!(" Updated OpenRouter API key: {:?}", settings.openrouter_provider.api_key);
60+
println!(" Masked API key display: {:?}", settings.openrouter_provider.get_masked_api_key());
61+
62+
// 5. Test provider navigation
63+
println!("\n5. Testing provider navigation...");
64+
println!(" Current provider index: {}", settings.selected_provider_index);
65+
settings.handle_action(SettingsAction::NavigateProviderNext);
66+
println!(" After next: {} ({})", settings.selected_provider_index,
67+
settings.get_provider_name(settings.selected_provider_index));
68+
settings.handle_action(SettingsAction::NavigateProviderNext);
69+
println!(" After next (wrap): {} ({})", settings.selected_provider_index,
70+
settings.get_provider_name(settings.selected_provider_index));
71+
72+
// 6. Test validation
73+
println!("\n6. Testing configuration validation...");
74+
match settings.validate() {
75+
Ok(()) => println!(" βœ… Configuration is valid"),
76+
Err(e) => println!(" ❌ Configuration error: {}", e),
77+
}
78+
79+
// Test with invalid configuration
80+
let mut invalid_settings = Settings::new();
81+
invalid_settings.local_provider.endpoint_url = None;
82+
invalid_settings.openrouter_provider.api_key = None;
83+
match invalid_settings.validate() {
84+
Ok(()) => println!(" ❌ Should have failed validation"),
85+
Err(e) => println!(" βœ… Correctly caught error: {}", e),
86+
}
87+
88+
// 7. Test security features
89+
println!("\n7. Testing security features...");
90+
let mut secure_config = ProviderConfig::new_openrouter();
91+
secure_config.set_api_key("sk-or-very-long-secret-key-12345".to_string());
92+
println!(" Full key: {:?}", secure_config.api_key);
93+
println!(" Masked display: {:?}", secure_config.get_masked_api_key());
94+
95+
println!("\n🎯 Success Criteria Verification:");
96+
println!("βœ… Provider configuration data structures defined");
97+
println!("βœ… Validation status management system ready");
98+
println!("βœ… Settings actions support provider operations");
99+
println!("βœ… Clean separation between LOCAL and OPENROUTER configs");
100+
println!("βœ… Extensible architecture for future providers");
101+
println!("βœ… Secure handling of sensitive data (API keys)");
102+
103+
println!("\n🎨 Provider Configuration Workflow:");
104+
println!("β€’ Settings contains both Local and OpenRouter providers");
105+
println!("β€’ Each provider tracks validation status independently");
106+
println!("β€’ API keys are masked for security in UI display");
107+
println!("β€’ Configuration validation ensures at least one provider");
108+
println!("β€’ Field focus management for input handling");
109+
println!("β€’ Non-blocking async validation architecture ready");
110+
111+
println!("\nπŸš€ Issue #29 Provider Configuration Foundation: COMPLETE!");
112+
println!(" The foundation is ready for backend communication settings");
113+
println!(" and extensible for future provider types!");
114+
}

0 commit comments

Comments
Β (0)