pub struct NotificationRouter { /* private fields */ }Expand description
複数の通知手段をオーケストレートし、リソースに基づいて適切な通知先にルーティングする
各種Sender(Slack, Mock等)を保持し、通知設定の種類に応じて適切なSenderに委譲します。
Implementations§
Source§impl NotificationRouter
impl NotificationRouter
Sourcepub fn new(
config: ResourceConfig,
identity_repo: Arc<dyn IdentityLinkRepository>,
) -> Self
pub fn new( config: ResourceConfig, identity_repo: Arc<dyn IdentityLinkRepository>, ) -> Self
Examples found in repository?
examples/mock_usage.rs (line 32)
18async fn main() -> Result<(), Box<dyn std::error::Error>> {
19 println!("🚀 Starting resource usage watcher (mock example)");
20 println!("This example uses mock implementations - no credentials required!\n");
21
22 // Load configuration
23 let config = load_config("config/resources.toml")?;
24
25 // Create identity link repository
26 let identity_repo = Arc::new(JsonFileIdentityLinkRepository::new(
27 "data/identity_links.json".into(),
28 ));
29
30 // Create mock repository and notification router
31 let repository = MockUsageRepository::new();
32 let notifier = NotificationRouter::new(config, identity_repo);
33
34 println!("✅ Mock repository and notification router initialized");
35
36 // Create use case
37 let usecase = NotifyResourceUsageChangesUseCase::new(repository, notifier).await?;
38
39 // Poll once to demonstrate
40 println!("📊 Polling for changes...\n");
41 usecase.poll_once().await?;
42
43 println!("\n✅ Example completed successfully!");
44 println!("💡 Note: Mock repository returns empty results by default.");
45 println!(
46 " To see actual notifications, configure mock notifications in config/resources.toml"
47 );
48
49 Ok(())
50}More examples
examples/basic_usage.rs (line 60)
19async fn main() -> Result<(), Box<dyn std::error::Error>> {
20 println!("🚀 Starting resource usage watcher (basic example)");
21
22 // Load resource configuration
23 let dotenv_path = dotenv::dotenv().ok();
24 let project_root = dotenv_path
25 .as_ref()
26 .and_then(|p| p.parent())
27 .map(|p| p.to_path_buf())
28 .unwrap_or_else(|| std::env::current_dir().expect("Failed to get current directory"));
29
30 let config_path =
31 std::env::var("RESOURCE_CONFIG").unwrap_or_else(|_| "config/resources.toml".to_string());
32 let absolute_config_path = project_root.join(&config_path);
33
34 let config = load_config(
35 absolute_config_path
36 .to_str()
37 .expect("Failed to convert path"),
38 )?;
39 println!("✅ Configuration loaded");
40
41 // Create repository
42 let service_account_key = std::env::var("GOOGLE_SERVICE_ACCOUNT_KEY")
43 .expect("GOOGLE_SERVICE_ACCOUNT_KEY must be set");
44 let absolute_key_path = project_root.join(&service_account_key);
45
46 let repository = GoogleCalendarUsageRepository::new(
47 absolute_key_path.to_str().expect("Failed to convert path"),
48 config.clone(),
49 )
50 .await?;
51 println!("✅ Google Calendar repository initialized");
52
53 // Create identity link repository
54 let identity_links_path = std::env::var("IDENTITY_LINKS_FILE")
55 .map(|p| project_root.join(p))
56 .unwrap_or_else(|_| project_root.join("data/identity_links.json"));
57 let identity_repo = Arc::new(JsonFileIdentityLinkRepository::new(identity_links_path));
58
59 // Create notification router (uses configured notification destinations and identity_repo)
60 let notifier = NotificationRouter::new(config, identity_repo);
61 println!("✅ Notification router initialized (using configured destinations)");
62
63 // Create use case
64 let usecase = NotifyResourceUsageChangesUseCase::new(repository, notifier).await?;
65
66 // Run polling loop
67 let interval = Duration::from_secs(60);
68 println!("🔍 Starting monitoring loop (interval: {:?})", interval);
69 println!("Press Ctrl+C to stop\n");
70
71 loop {
72 match usecase.poll_once().await {
73 Ok(_) => {
74 println!("✅ Poll completed successfully");
75 }
76 Err(e) => {
77 eprintln!("❌ Polling error: {}", e);
78 }
79 }
80
81 tokio::time::sleep(interval).await;
82 }
83}Trait Implementations§
Source§impl Notifier for NotificationRouter
impl Notifier for NotificationRouter
Auto Trait Implementations§
impl Freeze for NotificationRouter
impl !RefUnwindSafe for NotificationRouter
impl Send for NotificationRouter
impl Sync for NotificationRouter
impl Unpin for NotificationRouter
impl !UnwindSafe for NotificationRouter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more