pub struct NotifyResourceUsageChangesUseCase<R, N>where
R: ResourceUsageRepository,
N: Notifier,{ /* private fields */ }Implementations§
Source§impl<R, N> NotifyResourceUsageChangesUseCase<R, N>where
R: ResourceUsageRepository,
N: Notifier,
impl<R, N> NotifyResourceUsageChangesUseCase<R, N>where
R: ResourceUsageRepository,
N: Notifier,
Sourcepub async fn new(repository: R, notifier: N) -> Result<Self, ApplicationError>
pub async fn new(repository: R, notifier: N) -> Result<Self, ApplicationError>
Examples found in repository?
examples/mock_usage.rs (line 37)
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 64)
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}Sourcepub async fn poll_once(&self) -> Result<(), ApplicationError>
pub async fn poll_once(&self) -> Result<(), ApplicationError>
Examples found in repository?
examples/mock_usage.rs (line 41)
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 72)
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}Auto Trait Implementations§
impl<R, N> !Freeze for NotifyResourceUsageChangesUseCase<R, N>
impl<R, N> !RefUnwindSafe for NotifyResourceUsageChangesUseCase<R, N>
impl<R, N> Send for NotifyResourceUsageChangesUseCase<R, N>where
R: Send,
impl<R, N> Sync for NotifyResourceUsageChangesUseCase<R, N>where
R: Sync,
impl<R, N> Unpin for NotifyResourceUsageChangesUseCase<R, N>
impl<R, N> !UnwindSafe for NotifyResourceUsageChangesUseCase<R, N>
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