pub struct NotifyFutureResourceUsageChangesUseCase<R, N>where
R: ResourceUsageRepository,
N: Notifier,{ /* private fields */ }Expand description
未来および進行中のリソース使用状況の変更を監視し、通知するユースケース
このユースケースは以下の変更を検知して通知します:
- 新規作成: 新しいリソース使用予約が追加された
- 更新: 既存の予約内容が変更された
- 削除: 未来の予約がキャンセル/削除された
§スコープ
このユースケースは「未来および進行中」のリソース使用のみを監視対象とします。 予約期間が終了したリソースは自然に監視対象外となり、削除通知は送信されません。
Implementations§
Source§impl<R, N> NotifyFutureResourceUsageChangesUseCase<R, N>where
R: ResourceUsageRepository,
N: Notifier,
impl<R, N> NotifyFutureResourceUsageChangesUseCase<R, N>where
R: ResourceUsageRepository,
N: Notifier,
Sourcepub async fn new(
repository: Arc<R>,
notifier: N,
) -> Result<Self, ApplicationError>
pub async fn new( repository: Arc<R>, notifier: N, ) -> Result<Self, ApplicationError>
新しいインスタンスを作成し、初期状態を取得する
§Arguments
repository- リソース使用リポジトリ(Arc で共有)notifier- 通知サービス
§Errors
リポジトリから初期状態の取得に失敗した場合
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 = Arc::new(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 = NotifyFutureResourceUsageChangesUseCase::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 59)
20async fn main() -> Result<(), Box<dyn std::error::Error>> {
21 println!("🚀 Starting resource usage watcher (basic example)");
22
23 // Load resource configuration
24 let config_path =
25 std::env::var("RESOURCE_CONFIG").unwrap_or_else(|_| "config/resources.toml".to_string());
26
27 let config = load_config(&config_path)?;
28 println!("✅ Configuration loaded");
29
30 // Create repository
31 let service_account_key = std::env::var("GOOGLE_SERVICE_ACCOUNT_KEY")
32 .expect("GOOGLE_SERVICE_ACCOUNT_KEY must be set");
33
34 let id_mappings_path = std::env::var("GOOGLE_CALENDAR_MAPPINGS_FILE")
35 .unwrap_or_else(|_| "data/google_calendar_mappings.json".to_string());
36
37 let repository = Arc::new(
38 GoogleCalendarUsageRepository::new(
39 &service_account_key,
40 config.clone(),
41 PathBuf::from(&id_mappings_path),
42 )
43 .await?,
44 );
45 println!("✅ Google Calendar repository initialized");
46
47 // Create identity link repository
48 let identity_links_path = std::env::var("IDENTITY_LINKS_FILE")
49 .unwrap_or_else(|_| "data/identity_links.json".to_string());
50 let identity_repo = Arc::new(JsonFileIdentityLinkRepository::new(PathBuf::from(
51 identity_links_path,
52 )));
53
54 // Create notification router (uses configured notification destinations and identity_repo)
55 let notifier = NotificationRouter::new(config, identity_repo);
56 println!("✅ Notification router initialized (using configured destinations)");
57
58 // Create use case
59 let usecase = NotifyFutureResourceUsageChangesUseCase::new(repository, notifier).await?;
60
61 // Run polling loop
62 let interval = Duration::from_secs(60);
63 println!("🔍 Starting monitoring loop (interval: {:?})", interval);
64 println!("Press Ctrl+C to stop\n");
65
66 loop {
67 match usecase.poll_once().await {
68 Ok(_) => {
69 println!("✅ Poll completed successfully");
70 }
71 Err(e) => {
72 eprintln!("❌ Polling error: {}", e);
73 }
74 }
75
76 tokio::time::sleep(interval).await;
77 }
78}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 = Arc::new(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 = NotifyFutureResourceUsageChangesUseCase::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 67)
20async fn main() -> Result<(), Box<dyn std::error::Error>> {
21 println!("🚀 Starting resource usage watcher (basic example)");
22
23 // Load resource configuration
24 let config_path =
25 std::env::var("RESOURCE_CONFIG").unwrap_or_else(|_| "config/resources.toml".to_string());
26
27 let config = load_config(&config_path)?;
28 println!("✅ Configuration loaded");
29
30 // Create repository
31 let service_account_key = std::env::var("GOOGLE_SERVICE_ACCOUNT_KEY")
32 .expect("GOOGLE_SERVICE_ACCOUNT_KEY must be set");
33
34 let id_mappings_path = std::env::var("GOOGLE_CALENDAR_MAPPINGS_FILE")
35 .unwrap_or_else(|_| "data/google_calendar_mappings.json".to_string());
36
37 let repository = Arc::new(
38 GoogleCalendarUsageRepository::new(
39 &service_account_key,
40 config.clone(),
41 PathBuf::from(&id_mappings_path),
42 )
43 .await?,
44 );
45 println!("✅ Google Calendar repository initialized");
46
47 // Create identity link repository
48 let identity_links_path = std::env::var("IDENTITY_LINKS_FILE")
49 .unwrap_or_else(|_| "data/identity_links.json".to_string());
50 let identity_repo = Arc::new(JsonFileIdentityLinkRepository::new(PathBuf::from(
51 identity_links_path,
52 )));
53
54 // Create notification router (uses configured notification destinations and identity_repo)
55 let notifier = NotificationRouter::new(config, identity_repo);
56 println!("✅ Notification router initialized (using configured destinations)");
57
58 // Create use case
59 let usecase = NotifyFutureResourceUsageChangesUseCase::new(repository, notifier).await?;
60
61 // Run polling loop
62 let interval = Duration::from_secs(60);
63 println!("🔍 Starting monitoring loop (interval: {:?})", interval);
64 println!("Press Ctrl+C to stop\n");
65
66 loop {
67 match usecase.poll_once().await {
68 Ok(_) => {
69 println!("✅ Poll completed successfully");
70 }
71 Err(e) => {
72 eprintln!("❌ Polling error: {}", e);
73 }
74 }
75
76 tokio::time::sleep(interval).await;
77 }
78}Auto Trait Implementations§
impl<R, N> !Freeze for NotifyFutureResourceUsageChangesUseCase<R, N>
impl<R, N> !RefUnwindSafe for NotifyFutureResourceUsageChangesUseCase<R, N>
impl<R, N> Send for NotifyFutureResourceUsageChangesUseCase<R, N>
impl<R, N> Sync for NotifyFutureResourceUsageChangesUseCase<R, N>
impl<R, N> Unpin for NotifyFutureResourceUsageChangesUseCase<R, N>where
N: Unpin,
impl<R, N> !UnwindSafe for NotifyFutureResourceUsageChangesUseCase<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